COM Port lesen
-
Hallo,
ich möchte Daten über eine RS 232 Schnittstelle empfangen und diese dann bearbeiten und eine Antwort zurück schicken. Dabei verwende ich einen Thread um zu überprüfen, ob ich etwas gerade empfange. Mein Programm muss unbedingt die fähigkeit haben auch mal die Verbindung zum Com Port abzubauen und neu aufzubauen. Und darin steckt mein Problem.
Sobald ich eine Verbindung abgebaut habe, kann ich keine Verbindung zum selben Port aufbauen.
Beim ersten mal aufbauen einer Verbindung habe ich jedoch keine Probleme. Und wenn ich den Thread zum abhören der Schnittstelle nicht starte, dann hab ich auch keine Probleme.Damit ihr euch ein Bild von meinem Programm machen könnt, sind hier einige auszüge. Falls ihr einen anderen Lösungsweg habt oder irgendeinen Fehler erkennt, dann würd ich mich freuen, wenn ihr mich in Kenntnis setzt.
Die serielle Schnittstelle öffne ich folgendermaßen:
m_hHandlePort = CreateFile(portName, // Specify port device: default "COM1" GENERIC_READ | GENERIC_WRITE, // Specify mode that open device. 0, // the devide isn't shared. NULL, // the object gets a default security. CREATE_ALWAYS,//OPEN_EXISTING, // Specify which action to take on file. 0, // default. NULL); // default. if (GetCommState(m_hHandlePort,&m_dcbConfig) == 0) { AfxMessageBox("Get configuration port has problem."); return FALSE; }//if // Assign user parameter. [...] -> diverse einstellungen // Set current configuration of serial communication port. if (SetCommState(m_hHandlePort,&m_dcbConfig) == 0) { AfxMessageBox("Set configuration port has problem."); return FALSE; }//if
Hier seht ihr kurz, wie ich den Port schließe:
{ AfxMessageBox("Port Closeing isn't successed."); return FALSE; }//if ->unmittelbar danach leg ich meinen thread mit Suspend() zur Ruhe
Und zu guter letzt das herzstück meines Threads, der auf CWinThread aufbaut:
while(1) { if(ptrDlg->m_bConnected) { char cmess[100]; unsigned int lenBuff = 100; unsigned long lenMessage; //WaitCommEvent(ptrDlg->m_cComPort->getHandlePort(),0,0); if (ptrDlg->m_cComPort->read_scc(cmess,lenBuff,lenMessage) == TRUE) { [...] } }//if (ptrDlg->m_cComPort->read_scc(mess,lenBuff,lenMessage) == TRUE) }//if(ptrDlg->m_bConnected) }//while(1)
Hatte vergessen... meine read_scc funktion fehlt natürlich noch:
if (ReadFile(m_hHandlePort, // handle of file to read inputData, // handle of file to read sizeBuffer, // number of bytes to read &length, // pointer to number of bytes read NULL) == 0) // pointer to structure for data { AfxMessageBox("Reading of serial communication has problem."); return FALSE; } if (length > 0) { inputData[length] = NULL; // Assign end flag of message. return TRUE; } return FALSE;//TRUE
-
Hallo,
beim schließen des Ports solltest du noch CloseHandle() verwenden.
CloseHandle(m_hHandlePort); m_hHandlePort=NULL;
Micha