C/Windows: RS232 / Serielle Schnittstelle
lima-city → Forum → Programmiersprachen → C/C++ und D
adapter
artikel
beenden
buffer
code
datum
dauer
einlesen
kommunikation
null
port
programm
schleife
selten verwendete teile
setzen
teil
temperaturmessung
uni
url
windows
-
Hallo Zusammen,
ich bin auf der Suche nach einem guten und verständlichen Beispiel, wie man die serielle Schnittstelle (RS232) mit C unter Windows vernünftig ansprechen kann. Konkret geht es dabei um die Kommunikation zwischen dem PC (USB<->RS232-Adapter) mit einem Mikrocontroller von Atmel. Bisher sprech ich mit dem Atmel über telnet, aber auf dauer ist das keine Lösung...
Danke im Voraus! -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ganz einfach,
//---------------------------------------------------------------------- // Titel : Mess- und Reglungstechnik (Teil 1) //---------------------------------------------------------------------- // Funktion : Werte von einem COM-Port einlesen und in einer Textdatei speichern // Sprache : C // Datum : 01.12.2007 // Version : 1.0 // Autor : Stephan Schweig //---------------------------------------------------------------------- #define WIN32_LEAN_AND_MEAN // Selten verwendete Teile der Windows-Header nicht einbinden. #include <io.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <time.h> HANDLE hComm; DCB dcb; COMMTIMEOUTS commtimeouts; const char strDatei[] = "C:\\rs232_data.txt"; //---------------------------------------------------------------------- // Fehlermeldung vom System holen, ausgeben und Programm beenden int Fehlerausgabe(void) { LPVOID lpBuffer; DWORD dwFehlercode = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwFehlercode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpBuffer, 0, NULL ); printf("Fehler %d: %s\r\n", dwFehlercode, lpBuffer); LocalFree(lpBuffer); ExitProcess(dwFehlercode); if(hComm != NULL) CloseHandle(hComm); return 1; } //---------------------------------------------------------------------- //---------------------------------------------------------------------- // Hauptprogramm: COM8 öffnen und Daten vom Port in eine Datei schreiben int main(int argc, char* argv[]) { // Port öffnen hComm = CreateFile( "COM8", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // Port geöffnet? if(hComm == INVALID_HANDLE_VALUE) return Fehlerausgabe(); // IO-Buffer setzen if(SetupComm(hComm, 2048, 2048) == FALSE) return Fehlerausgabe(); // COM-Port einstellen if(GetCommState(hComm, &dcb) == FALSE) return Fehlerausgabe(); dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.fRtsControl = 1; dcb.fOutxCtsFlow = 1; if(SetCommState(hComm, &dcb) == FALSE) return Fehlerausgabe(); // Timout setzen memset(&commtimeouts, 0, sizeof(COMMTIMEOUTS)); if(SetCommTimeouts(hComm, &commtimeouts) == FALSE) return Fehlerausgabe(); // IO-Buffer leeren PurgeComm(hComm, PURGE_RXABORT | PURGE_TXABORT | PURGE_RXCLEAR | PURGE_TXCLEAR); printf("Zum beenden des Programms ESC druecken.\r\n\r\n"); FILE* fp; DWORD commerr; COMSTAT comstat; DWORD bytes_read; UINT8 b; while(1) { b = 0; ClearCommError(hComm, &commerr, &comstat); if(comstat.cbInQue != 0) { // Wenn Bytes im Buffer vorhanden, dann lesen if(ReadFile(hComm, &b, 1, &bytes_read, NULL) != 0) { printf("%c",b); fp = fopen(strDatei,"a"); if(fp != NULL) { fprintf(fp,"%c",b); fclose(fp); fp = NULL; } } } // Wenn ESC gedrückt wird, die Schleife unterbrechen. if(kbhit()) { if(_getch() == 27) break; } } // COM-Port schließen CloseHandle(hComm); return 0; } //----------------------------------------------------------------------
Kommt auch von einer ATmega-Temperaturmessung: http://www-stud.uni-due.de/~sdstscwe/index.php/Artikel/1-Sonstige%20Artikel/44-Mess-%20und%20Reglungstechnik%20(Teil%201)?start=3 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage