Probleme mit serieller Datenübertragung an COM1
-
Servus!
Ich habe ein Messgerät an COM1 angeschlossen. Führt man an dem Gerät eine Messung durch sendet dieses anschließend das Ergebnis an den PC. Mit dem Hyperterminal von WinXP empfange ich folgenden String:
"<10V(191)223> <10U(16.12.1996)066> <10D(#01:0.22#02:0.22#03:0.22#04:0.24#05:0.25#06:0.28#07:0.34#08:0.42#09:0.55#10 :0.78#11:1.10#12:1.48#13:1.99#14:2.42#15:2.74#16:2.88#17:2.91#18:2.93#19:2.94#20 :2.96#21:2.98)145> <10K(#01:2.23#02:1.69#03:0.21#04:2.98#05:1.10#06:1.63#07:1.45#08:2.23#09:1.00#10 :0.25#11:2.00#12:4011)140>"Soweit ist alles in Ordnung. In meiner Anwendung bearbeite ich die Kommunikation mit COM1 wie folgt:
// Variablen für Übertragung int iPort =1; int iBaud =9600; int iSize =8; int iParity =0; int stopbit=1; int fRtsControl =1; int iTimeout =50; int iTotalTimeout =1000; char puffer[400]; for(int i=0; i<400; i++) puffer[i] = 'x'; DWORD len = 323; DWORD receive = 0; bool ret = false; char port[]= "COM0123456789:"; sprintf(port, "COM%i:", iPort); // Erzeuge Handle für COM1 HANDLE m_hPort = CreateFile( port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);Das Handle für den COMPort ist o.K. hat dann immer die Adresse 0x000007ac
Die Parameter für CreateFile() habe ich aus einer Beipielanwendung entnommen.// Setzte Timeouts COMMTIMEOUTS comtime; GetCommTimeouts(m_hPort, &comtime); comtime.ReadIntervalTimeout= iTimeout; comtime.ReadTotalTimeoutConstant= iTotalTimeout; comtime.WriteTotalTimeoutConstant= iTotalTimeout; comtime.ReadTotalTimeoutMultiplier=2; comtime.WriteTotalTimeoutMultiplier=0; SetCommTimeouts(m_hPort, &comtime); // Setze Kommunikationsparameter DCB dcb; GetCommState(m_hPort, &dcb); dcb.BaudRate= iBaud; dcb.ByteSize= iSize; dcb.DCBlength= 28; dcb.EofChar= 0; dcb.ErrorChar= 0; dcb.fRtsControl= fRtsControl; dcb.Parity= iParity; dcb.StopBits= stopbit; dcb.fInX=0; dcb.fOutX=0; dcb.fAbortOnError= 1;Diese Beiden Objekte verstehe ich nicht wirklich. Habe die Parameter aus eine Beispielanwendung übernommen und nur die spezifischen Parameter vom Hersteller des Gerätes (iBaud, iSize, iParity, stopbit) geändert.
// Lese von COM bis spezielles Zeichen im String enthalten ist while (puffer[220] != 'K') { ReadFile(m_hPort, puffer, len, &receive, NULL); } CloseHandle(m_hPort);Ab hier wirds problematisch. Wenn ich mein System neu starte und meine Anwendung laufen lasse (debugmodus) erhalte ich zwar keinen Fehler, aber nur merkwürde Zeichen anstelle den Messwerten (wie oben). So sieht der String dann aus:
"2d!(j4zJJJBJ_JJijmjOJjjOJjOBjBJObB~JJBJJiJBjBjj"Wenn ich die Anwendung pausiere und kurz das Hyperterminal starte und die Messwerte erneut übertragen lasse, erscheinen Sie in gewünschter Form. Nun schließe ich das Hyperterminal und starte meine Anwendung erneut. Die jetzt übertragenen Werte entsprechen den gewünschten.
Was kann ich tun, ohne nach jedem Neustart erst das Hyperterminal zu starten?

-
Nimm doch die Klasse CSerial oder CSerialMFC von www.codeproject.com
Dazu gibts hier im Board auch genug Beiträge. Die funktioniert gut, außerdem kannst Du Dir aus der Beispielanwenung gleich noch die Dialoge für die Einstellungen ziehen. Dort kann man auch nachrichtenbasiert arbeiten, muss also nicht ständige die COM-Schnittstelle abfragen.
-
Könnte evtl. an einem falschen Parameter der Schnittstelle liegen, falsche Geschwindigkeit, Start, Stop Bit etc.