GPS COM Port
-
Guten Morgen zusammen,
ich habe ein Problem beim Auslesen eines bzw. von 2 COM Ports. Es handelt sich dabei um ein Modul von Option. Der eine COM Port(comcontrol) ist dazu da um Steuerbefehle an das GPS Modul zu schicken, sprich On/Off usw., und der andere(comdata) um die regelmäßig erzeugen Daten des Moduls auszulesen.
Wir benutzen bewusst kein .NET da es sie um Terminalgeräte handelt die nicht über übige Systemressourcen verfgügen. Problem ist nun, dass ich das Gerät mit dem Hyperterminal und dem entsprechendnen Befehlt starten und mit einer zweiten Instanz des HT auch auslesen kann. Allerdings schaffe ich das mit meiner Anwednung nicht. Hat jemand eine Ahnung wo der Fehler liegen könnte?P.S.: Ich darf die Steuerbefehle nicht öffentlich machen deswegen habe ich sie mal ersetzt
#pragma region COM Ports öffnen HANDLE comportControl = CreateFile(port_nameControl.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL); HANDLE comportData = CreateFile(port_nameData.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); #pragma endregion #pragma region CreateFile Control Check if(comportControl == INVALID_HANDLE_VALUE) { cout << endl; cout << "Fehler beim Öffnen des Control COM Ports" << endl; cout << "COM Port: " << port_nameControl.c_str() << endl; cout << "Fehlercode: " << hex << GetLastError() << endl; cout << "Meldung: " << PrintGetLastError().c_str() << endl; FindClose(comportControl); CloseHandle(comportControl); cin >> i; return 1; } else { cout << "Control COM Port \"" << port_nameControl.c_str() << "\" wurde geöffnet" << endl; } #pragma endregion #pragma region CreateFile Data Check if(comportData == INVALID_HANDLE_VALUE) { cout << endl; cout << "Fehler beim Öffnen des Data COM Ports" << endl; cout << "COM Port: " << port_nameData.c_str() << endl; cout << "Fehlercode: " << hex << GetLastError() << endl; cout << "Meldung: " << PrintGetLastError().c_str() << endl; FindClose(comportControl); CloseHandle(comportControl); FindClose(comportData); CloseHandle(comportData); cin >> i; return 1; } else { cout << "Data COM Port \"" << port_nameData.c_str() << "\" wurde geöffnet" << endl; } #pragma endregion #pragma region COM Port Struktur Control #pragma region COM Port Struktur DCB dcbControl; SecureZeroMemory(&dcbControl, sizeof(DCB)); dcbControl.DCBlength = sizeof(DCB); #pragma endregion #pragma region GetCommState if (GetCommState(comportControl, &dcbControl) == 0) { cout << endl; cout << "Fehler beim Lesen des Control COM Port Status" << endl; cout << "COM Port: " << port_nameControl.c_str() << endl; cout << "Fehlercode: " << hex << GetLastError() << endl; cout << "Meldung: " << PrintGetLastError().c_str() << endl; FindClose(comportControl); CloseHandle(comportControl); FindClose(comportData); CloseHandle(comportData); cin >> i; return 1; } else { cout << "Control COM Port Status Struktur wurde eingelesen" << endl; } #pragma endregion #pragma region Modify ComState dcbControl.BaudRate = CBR_9600; dcbControl.Parity = NOPARITY; dcbControl.StopBits = ONESTOPBIT; dcbControl.ByteSize = 8; #pragma endregion #pragma region SetCommState if (SetCommState(comportControl, &dcbControl) == 0) { cout << endl; cout << "Fehler beim Setzen des Control COM Port Status" << endl; cout << "COM Port: " << port_nameControl.c_str() << endl; cout << "Fehlercode: " << hex << GetLastError() << endl; cout << "Meldung: " << PrintGetLastError().c_str() << endl; FindClose(comportControl); CloseHandle(comportControl); FindClose(comportData); CloseHandle(comportData); cin >> i; return 1; } else { cout << "Control COM Port Status Struktur wurde geschrieben" << endl; } #pragma endregion #pragma endregion #pragma region COM Port Struktur Data #pragma region SetCommMask if(SetCommMask(comportData, EV_RXCHAR | EV_ERR) == 0) { cout << endl; cout << "Fehler beim setzen der Data COM Port Mask" << endl; cout << "COM Port: " << port_nameData.c_str() << endl; cout << "Fehlercode: " << hex << GetLastError() << endl; cout << "Meldung: " << PrintGetLastError().c_str() << endl; FindClose(comportControl); CloseHandle(comportControl); FindClose(comportData); CloseHandle(comportData); cin >> i; return 1; } else { cout << "Data COM Port Mask wurde geschrieben" << endl; } #pragma endregion #pragma region COM Port Struktur DCB dcbData; SecureZeroMemory(&dcbData, sizeof(DCB)); dcbData.DCBlength = sizeof(DCB); #pragma endregion #pragma region GetCommState if (GetCommState(comportData, &dcbData) == 0) { cout << endl; cout << "Fehler beim Lesen des Data COM Port Status" << endl; cout << "COM Port: " << port_nameData.c_str() << endl; cout << "Fehlercode: " << hex << GetLastError() << endl; cout << "Meldung: " << PrintGetLastError().c_str() << endl; FindClose(comportControl); CloseHandle(comportControl); FindClose(comportData); CloseHandle(comportData); cin >> i; return 1; } else { cout << "Data COM Port Status Struktur wurde eingelesen" << endl; } #pragma endregion #pragma region Modify ComState dcbData.BaudRate = CBR_9600; dcbData.Parity = NOPARITY; dcbData.StopBits = ONESTOPBIT; dcbData.ByteSize = 8; #pragma endregion #pragma region SetCommState if (SetCommState(comportData,&dcbData) == 0) { cout << endl; cout << "Fehler beim Setzen des Data COM Port Status" << endl; cout << "COM Port: " << port_nameData.c_str() << endl; cout << "Fehlercode: " << hex << GetLastError() << endl; cout << "Meldung: " << PrintGetLastError().c_str() << endl; FindClose(comportControl); CloseHandle(comportControl); FindClose(comportData); CloseHandle(comportData); cin >> i; return 1; } else { cout << "Data COM Port Status Struktur wurde geschrieben" << endl; } #pragma endregion #pragma endregion #pragma region AT Command schreiben const char atcommandclear[] = "Behel zum Bereinigen\r\n"; const char atcommandstart[] = "Befehl zum Starten mit 2 Sekunden Intervall\r\n"; #pragma region Buffer lesen(Falls was da ist) ReadFile(comportData, readBuffer, sizeof(readBuffer), &bytesReading, NULL); readBuffer[bytesReading] = '\0'; cout << readBuffer << endl; cout << "Control COM Port \"" << port_nameControl.c_str() << "\" Initialisierung wurde gelesen. Bytes: " << byteswritten << endl; #pragma endregion #pragma region GPS Clear if(WriteFile(comportControl, atcommandclear, sizeof(atcommandclear), &byteswritten, NULL) == FALSE) { cout << endl; cout << "Fehler beim Schreiben des Clear Commands in den Control COM Port" << endl; cout << "COM Port: " << port_nameControl.c_str() << endl; cout << "Fehlercode: " << hex << GetLastError() << endl; cout << "Meldung: " << PrintGetLastError().c_str() << endl; FindClose(comportControl); CloseHandle(comportControl); FindClose(comportData); CloseHandle(comportData); cin >> i; return 1; } else { ReadFile(comportData, readBuffer, sizeof(readBuffer), &bytesReading, NULL); readBuffer[bytesReading] = '\0'; cout << readBuffer << endl; cout << "Control COM Port \"" << port_nameControl.c_str() << "\" Clear Command wurde geschrieben. Bytes: " << byteswritten << endl; } #pragma endregion //#pragma region Warten bis start //for(int i = 0; i < 50000; i += 10000) //{ // cout << (50000 - i) / 1000 << " Sekunden bis GPS Startinitialisierung" << endl; // Sleep(10000); //} //#pragma endregion #pragma region GPS Start if(WriteFile(comportControl, atcommandstart, sizeof(atcommandstart), &byteswritten, NULL) == FALSE) { cout << endl; cout << "Fehler beim Schreiben des Start Commands in den Control COM Port" << endl; cout << "COM Port: " << port_nameControl.c_str() << endl; cout << "Fehlercode: " << hex << GetLastError() << endl; cout << "Meldung: " << PrintGetLastError().c_str() << endl; FindClose(comportControl); CloseHandle(comportControl); FindClose(comportData); CloseHandle(comportData); cin >> i; return 1; } else { ReadFile(comportData, readBuffer, sizeof(readBuffer), &bytesReading, NULL); readBuffer[bytesReading] = '\0'; cout << readBuffer << endl; cout << "Control COM Port \"" << port_nameControl.c_str() << "\" Start Command wurde geschrieben. Bytes: " << byteswritten << endl; } #pragma endregion //#pragma region Warten bis verfügbar //for(int i = 0; i < 50000; i += 10000) //{ // cout << (50000 - i) / 1000 << " Sekunden bis GPS verfügbar" << endl; // Sleep(10000); //} //#pragma endregion FindClose(comportControl); CloseHandle(comportControl); #pragma endregion #pragma region Data Com Port Settings #pragma region Set Timeout // #pragma region COM Port Timeouts Struktur // COMMTIMEOUTS ct; // #pragma endregion // #pragma region GetCommTimeouts // if(GetCommTimeouts(comportData, &ct) == 0) // { // cout << "Fehler beim Lesen des Data COM Port Timeouts" << endl; // cout << "COM Port: " << port_nameData.c_str() << endl; // cout << "Fehlercode: " << hex << GetLastError() << endl; // cout << "Meldung: " << PrintGetLastError().c_str() << endl; // // FindClose(comportData); // CloseHandle(comportData); // // cin >> i; // return 1; // } // else // { // cout << "Data COM Port Timeout Struktur wurde eingelesen" << endl; // } // #pragma endregion // #pragma region Modify ComTimeouts // ct.ReadIntervalTimeout = 1000 / CBR_4800 * (dcbData.ByteSize + (dcbData.Parity == NOPARITY ? 0 : 1) + (dcbData.StopBits == ONESTOPBIT ? 1 : 2)) * 2; // ct.ReadTotalTimeoutMultiplier = 0; // [ms] wird mit Read-Buffer-Size multipliziert // ct.ReadTotalTimeoutConstant = 50; // wird an ReadTotalTimeoutMultiplier angehängt // ct.WriteTotalTimeoutMultiplier = 0; // ct.WriteTotalTimeoutConstant = 0; // #pragma endregion // #pragma region SetCommTimeouts // if(SetCommTimeouts(comportData, &ct) == 0) // { // cout << "Fehler beim Setzen des Data COM Port Timeouts" << endl; // cout << "COM Port: " << port_nameData.c_str() << endl; // cout << "Fehlercode: " << hex << GetLastError() << endl; // cout << "Meldung: " << PrintGetLastError().c_str() << endl; // // FindClose(comportData); // CloseHandle(comportData); // // cin >> i; // return 1; // } // else // { // cout << "Data COM Port Timeout Struktur wurde geschrieben" << endl; // } //#pragma endregion #pragma endregion #pragma region OVERLAPPED Struktur mit Event OVERLAPPED o; //SecureZeroMemory(&o, sizeof(OVERLAPPED)); o.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); o.Internal = 0; o.InternalHigh = 0; o.Offset = 0; o.OffsetHigh = 0; if(o.hEvent == NULL) { cout << endl; cout << "Fehler beim Erstellen des OVERLAPPED Events" << endl; cout << "COM Port: " << port_nameData.c_str() << endl; cout << "Fehlercode: " << hex << GetLastError() << endl; cout << "Meldung: " << PrintGetLastError().c_str() << endl; FindClose(comportControl); CloseHandle(comportControl); FindClose(comportData); CloseHandle(comportData); cin >> i; return 1; } else { cout << "Data COM Port \"" << port_nameData.c_str() << "\" OVERLAPPED Event wurde initialisiert" << endl; } #pragma endregion #pragma region SetupComm //if(SetupComm(comportData, 100, 100) == 0) //{ // cout << "Fehler beim Initialisieren des Data COM Port" << endl; // cout << "COM Port: " << port_nameData.c_str() << endl; // cout << "Fehlercode: " << hex << GetLastError() << endl; // cout << "Meldung: " << PrintGetLastError().c_str() << endl; // FindClose(comportData); // CloseHandle(comportData); // cin >> i; // return 1; //} //else //{ // cout << "Data COM Port wurde initialisiert" << endl; //} #pragma endregion #pragma endregion cout << "Schleifenverarbeitung wird gestartet" << endl << endl; #pragma region GPS Daten Intervall DWORD dwEvtMask; nmeaINFO info; nmeaPARSER parser; nmea_zero_INFO (&info); nmea_parser_init(&parser); do { #pragma region Wait for Event if(WaitCommEvent(comportData, &dwEvtMask, &o)) { cout << endl; cout << "Fehler bei WaitCommEvent des Data COM Ports" << endl; cout << "COM Port: " << port_nameData.c_str() << endl; cout << "Fehlercode: " << hex << GetLastError() << endl; cout << "Meldung: " << PrintGetLastError().c_str() << endl; } else { cout << "Data COM Port \"" << port_nameData.c_str() << "\" WaitCommEvent" << endl; } #pragma endregion if (WAIT_OBJECT_0 == WaitForSingleObject(o.hEvent, INFINITE)) { if (dwEvtMask & EV_RXCHAR) { #pragma region ReadFile if (!ReadFile(comportData, readBuffer, sizeof(readBuffer), &bytesReading, &o)) { cout << endl; cout << "Fehler beim Lesen des Data COM Port" << endl; cout << "COM Port: " << port_nameData.c_str() << endl; cout << "Fehlercode: " << hex << GetLastError() << endl; cout << "Meldung: " << PrintGetLastError().c_str() << endl; } else { readBuffer[bytesReading] = '\0'; cout << "Data from Data COM Port:" << endl; cout << readBuffer << endl << endl; nmea_parse(&parser, readBuffer, bytesReading, &info); cout << "Long: " << info.lon << endl; cout << "Lati: " << info.lat << endl; #pragma region Position schreiben st1->Prepare(setPosition); st1->Set(1, info.lat); st1->Set(2, info.lon); st1->Set(3, fahrzeugID); st1->Execute(); tr1->Commit(); #pragma endregion } #pragma endregion } if (dwEvtMask & EV_ERR) { cout << endl; cout << "Fehler beim Empfangen von Daten" << endl; break; } } } while (1); nmea_parser_destroy(&parser); #pragma endregion cout << "Schleifenverarbeitung wird beendet" << endl << endl;
-
Es wäre total hilfreich, wenn du diese Unmenge an redundantem Code entfernen würdest, damit der interessante Teil nicht unter Bergen von immer gleichem Fehlerbehandlungcode untergeht. Das tut ja schon beim Ansehen weh.
Außerdem wäre es super, wenn du deine Problembeschreibung ("ich schaffe das nicht") etwas ausführlicher gestalten würdest. Zumindest könntest du sagen, an welcher Stelle im Code das Problem auftritt.
-
Ach scheiße...Ich habe da auch was vergessen einzufügen^^
Das Problem ist dass ich über den HT den Befehl absetzen kann und das GPS Modul gestartet wird und auch die Meldung "OK" zurück kommt. Bei mir kommt allerdings gar nichts zurück und das GPS Modul wird auch nicht gestartetReadFile(comportData, readBuffer, sizeof(readBuffer), &bytesReading, NULL); readBuffer[bytesReading] = '\0'; cout << readBuffer << endl; cout << "Control COM Port \"" << port_nameControl.c_str() << "\" Initialisierung wurde gelesen. Bytes: " << byteswritten << endl; if(WriteFile(comportControl, atcommandclear, sizeof(atcommandclear), &byteswritten, NULL)) { //Hat nicht geklappt return 1; } else { ReadFile(comportData, readBuffer, sizeof(readBuffer), &bytesReading, NULL); readBuffer[bytesReading] = '\0'; cout << readBuffer << endl; cout << "Control COM Port \"" << port_nameControl.c_str() << "\" Clear Command wurde geschrieben. Bytes: " << byteswritten << endl; } if(WriteFile(comportControl, atcommandstart, sizeof(atcommandstart), &byteswritten, NULL)) { //Hat auch nicht geklappt return 1; } else { ReadFile(comportData, readBuffer, sizeof(readBuffer), &bytesReading, NULL); readBuffer[bytesReading] = '\0'; cout << readBuffer << endl; cout << "Control COM Port \"" << port_nameControl.c_str() << "\" Start Command wurde geschrieben. Bytes: " << byteswritten << endl; }
-
Du brichst ab, wenn WriteFile erfolgreich war.
-
Scheiße nein:-D Man das gibt es doch nicht. Da habe ich zu sehr gekürzt^^ Bei der Abfrage gehört wie bei dem original Code ein == FALSE dahinter^^
Also er sagt mir schon dass ich was geschrieben hätte aber er will zum verrecken keine Ausgabe machen bzw. die Antwort wird falsch eingelesen. Aber ich kann das Problem nicht erkennen
-
Bitte den Rückgabewert von ReadFile prüfen und ggf. GetLastError aufrufen.
-
Lesen und schreiben von COM Ports ist *nicht* trivial!
Verwende bitte eine Klasse, die das schon korrekt macht, dann musst Du nicht das Rad nochmals erfinden... siehe z.B.:
http://www.codeproject.com/Articles/992/Serial-library-for-C
oder alternativ:
http://www.codeproject.com/Articles/382/CSerialPort-v1-03-Serial-Port-Wrapper
-
Wenn du deine Seele nicht verkaufen willst (sprich Registrierung bei Codeproject / GPL): http://www.naughter.com/serialport.html
Und ich kann bestätigen, dass COM-Ports mit der WinAPI echt anstrengend zu benutzen sind.