Hallo zusammen. Ich habe ein Problem. Ich möchte mit einer C-Routine Daten durch eine RS232 Schnittstelle empfangen und in einem Zahlenfeld speichern. Das Versenden der Daten funktioniert bereits. Stand der Dinge: Ich habe einen Controler (ATMEGA168) mit welcchem ich mit einer eingestellte Baudrate ein einfaches String z.B. 'R' versende. Es ist eine Dauerschleife, so daß der Controller dauernd 'R' sendet. Mit einem Terminal kann ich die daten empfangen, dauernd nur 'R'. Habe mich mit der RS232 Schnittstelle beschäftigt. Befor man Daten mit dieser Empfangen kann gilt es zunächst einige einstellungen durchzuführen. HANDLE OpenComm(char* Port) { // Öffnet den Port und gibt ein Handle zurück HANDLE hCom = CreateFile(Port, // z.B. "COM1", GENERIC_READ|GENERIC_WRITE, //zum Senden und Empfangen 0, // Für comm devices exclusive- // access notwendig 0, // Keine security attributes OPEN_EXISTING, // Für comm devices notwendig 0, // Kein overlapped I/O 0); // Für comm devices muss NULL sein if (hCom == INVALID_HANDLE_VALUE) ShowLastError("CreateFile: "+AnsiString(Port)); return hCom; void SetDCB(HANDLE hCom) { DCB dcb; // Device ControlBlock BOOL fSuccess = GetCommState(hCom, &dcb); // DCB lesen if (!fSuccess) ShowLastError("GetCommState"); dcb.BaudRate = 9600; // Baudrate=9600 dcb.ByteSize = 8; // 8 Datenbits dcb.Parity = NOPARITY; // keine Parity dcb.StopBits = ONESTOPBIT; // 1 Stopbit // SetCommState konfiguriert die serielle Schnittstelle fSuccess = SetCommState(hCom, &dcb); if (!fSuccess) ShowLastError("SetCommState"); void SetReadTimeouts(HANDLE hCom) { COMMTIMEOUTS t; // Alle Wert in Millisekunden // Werte für ReadFile: t.ReadIntervalTimeout=100; // Zeit zwischen zwei Zeichen t.ReadTotalTimeoutMultiplier=0; // pro Zeichen t.ReadTotalTimeoutConstant=1; // Werte für WriteFile: wenn beide 0 sind, kein Timeout // beim Schreiben t.WriteTotalTimeoutMultiplier=0; t.WriteTotalTimeoutConstant=0; if (!SetCommTimeouts(hCom,&t)) ShowLastError("SetCommTimeouts"); Diese Einstellungen muß man zum emfangen von Daten machen. Ich habe Einstellungen beim Controller von : Baudrate 115400 Baud 8 Datenbits keine Parity 1 Stopbit Und möchte die Daten mit der Routine ReadFile(hComReceive, // handle des Com-Ports Data, // Adresse des Datenpuffers n, // Anzahl der zu lesenden Bytes &NumberOfBytesRead, // Adresse übergeben 0); // kein overlapped I/O empfanengen und das Data Datenpuffer in ein Zahlen feld speichern. Ich hatte bis jetzt keinen Erfolg. Kann mir jemand sagen, welche Einstellungen ich noch zu meinen Controllereinstellungen am PC vornehmen muß bei den Enstellroutinen? Was hat es mit der Funktion SetTimeouts auf sich? David
Naja, 9600 Baud auf dem PC und 115200 Baud auf'm µC: das verträgt sich schon mal nicht. Dann macht es schon einen Unterschied, ob man 0 oder NULL verwendet. Dann gibt es noch den Empfangspuffer: BOOL SetupComm( HANDLE hFile, // handle to communications device DWORD dwInQueue, // size of input buffer DWORD dwOutQueue // size of output buffer ); Und wie willst Du die Datem empfangen? Polling oder ereignisgesteuert? siehe auch hier: http://www.mikrocontroller.net/forum/read-8-396803.html#new Blackbird
Sicher sollte man NULL und 0 rein aus Prinzip utnerscheiden, aber den grossen Unterschied sollte es nicht machen ;) windef.h #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif Aber: 115__4__00 und 9600 Baud vertragen siche wirklich nicht ;) Und: ReadFile(hComReceive, // handle des Com-Ports Data, // Adresse des Datenpuffers n, // Anzahl der zu lesenden Bytes &NumberOfBytesRead, // Adresse übergeben 0); // kein overlapped I/O Was steht in n? Gruss, XtSI
Danke für den Tipp mit der Baudrate, habe es Übersehen!! Zu Deiner Funktion: BOOL SetupComm( HANDLE hFile, // handle to communications device DWORD dwInQueue, // size of input buffer DWORD dwOutQueue // size of output buffer ); Mit dieser Funktion tue ich den Speicherplatz reservieren für die ankommenden und abgehenden Daten. Was soll es für einen Unterschied machen ob ich NULL oder 0 verwende? Studiere eben Dein Programm. David
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.