Com Port Session öffnen bzw. schliessen ohne erneute CreateFile Anweisung auszuführen
-
HAllo,
gibt es eine Funktion für den COM Port um nach einer CreateFile Anweisung den Port einfach nur mit z.B. OpenFile/ CloseFile oder so zu öffnen bzw. zu schliessen ohne das man mit CreateFile immer wieder eine neue Komminikations session öffnen muss ?
MfG
-
Nein.
Es ist wahrscheinlich besser, wenn du erklärst, was du vorhast, was dabei das Problem ist, und warum du glaubst, dass eine Antwort auf deine Frage dir dabei helfen könnte.
-
Also ich habe da folgendes Problem und zwar tausche ich mit einem Microcontroller Daten aus wenn ich die Session mit CloseHandle schliesse (Stop drücken um den Test am MIC zu beenden) und danach wieder eine neue Session starte MIC wieder mit Daten versorgen), dann öffnet mir zwar Windows den Port aber ich kann keine Daten senden. Ich glaube das Problem liegt vieleicht sogar bei SetCommState guck dir das mal an bitte vieleicht hast du eine bessere Idee:
BOOL CLVErrSimDlg::SerialCommunikation() { DCB dcb; COMMTIMEOUTS comtimeout; // Serielle Schnittstelle konfigurieren m_hCom = CreateFile(m_pCOMPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL , NULL); BOOL handle = GetCommState(m_hCom, &dcb); // Werte des COM-Ports holen (vorinitialisieren) if(!handle) { int error = GetLastError(); CString IntToStr, str; IntToStr.Format("%d", error); str = "Zugriff auf COM-Port fehlgeschlagen. \nErrorcode: "+IntToStr; MessageBox(str, "COM-Port Zugriffsverweigerung", MB_ICONERROR); } else { dcb.BaudRate = CBR_9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(m_hCom, &dcb); // neue Werte übergeben // Timeout-Zeit für die Serielle Schnittstelle einstellen GetCommTimeouts(m_hCom, &comtimeout); comtimeout.ReadIntervalTimeout = MAXDWORD; comtimeout.ReadTotalTimeoutConstant = 500; comtimeout.ReadTotalTimeoutMultiplier = 10; comtimeout.WriteTotalTimeoutConstant = 500; comtimeout.WriteTotalTimeoutMultiplier = MAXWORD; // prüfen ob die COM-Port-Timeoutzeit erfolgreich konfiguriert wurde BOOL SetComSt = SetCommTimeouts (m_hCom, &comtimeout); if (!SetComSt) { int error = GetLastError(); CString IntToStr, str; IntToStr.Format("%d", error); str = "Zugriff auf COM-Port fehlgeschlagen. \nErrorcode: "+IntToStr; MessageBox(str, "COM-Port Zugriffsverweigerung", MB_ICONERROR); return 0; } //PurgeComm( m_hCom, PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_RXABORT ); } // Vergleich ob der HANDLE Gültigkeit aufweist if(m_hCom == INVALID_HANDLE_VALUE) return 0; else return 1; } BOOL CLVErrSimDlg::SendStopCommand() { DWORD f = 10; int m_nAKN = 0; BOOL m_bWrite = 0; BOOL m_bReadStatus = 0; if((m_bStartFlg == TRUE) && (m_bErrFlgRc == FALSE)) { // *************** Stop-Befehl zum Controller senden **************************** m_bWrite = WriteFile(m_hCom, &m_nStopCommand, 1, &f, NULL); if(m_bWrite == FALSE) m_bErrFlgTr = TRUE; else { m_bReadStatus = ReadFile(m_hCom, &m_nAKN, 1, &f, NULL); // Acknowledge-Zeichen abfragen if(m_nAKN !=6) m_bErrFlgRc = TRUE; } } BOOL handle = CloseHandle(m_hCom); m_bStartFlg = FALSE; m_bErrFlgTr = FALSE; m_bErrFlgRc = FALSE; m_bAutomTestFlg = FALSE; m_nFlagNum = 0; m_ctrLogStatus.AddString("Test gestoppt !!!"); if((m_bErrFlgTr == FALSE) && (m_bErrFlgTr == FALSE)) return 1; else return 0; }
-
mike2003 schrieb:
wenn ich die Session mit CloseHandle schliesse (Stop drücken um den Test am MIC zu beenden) und danach wieder eine neue Session starte MIC wieder mit Daten versorgen), dann öffnet mir zwar Windows den Port aber ich kann keine Daten senden.
Was heißt, du kannst keine Daten senden? Wie äußert sich das?
SetCommState(m_hCom, &dcb); // neue Werte übergeben
SetCommState liefert BOOL zurück. Den solltest du mal prüfen.
if((m_bErrFlgTr == FALSE) && (m_bErrFlgTr == FALSE)) return 1;
Warum prüfst du zweimal dasselbe Flag?
Du verwendest nicht zufällig Embedded VC mit einem iPAQ / PocketPC 2002?
-
m_bErrFlgRc soll der zweite Parameter heissen sorry ist wohl da passiert als ich hier nur das nötigste aufzeigen wollte.
// prüfen ob die COM-Port-Timeoutzeit erfolgreich konfiguriert wurde BOOL SetComSt = SetCommTimeouts (m_hCom, &comtimeout); if (!SetComSt) { int error = GetLastError(); CString IntToStr, str; IntToStr.Format("%d", error); str = "Zugriff auf COM-Port fehlgeschlagen. \nErrorcode: "+IntToStr; MessageBox(str, "COM-Port Zugriffsverweigerung", MB_ICONERROR); return 0; }
Da teste ich den boolschen Wert ab.
Äussern tut sich das daran das ich über die serielle keine bits messen kann was ich ja beim senden aber normal tuhe deshalb bin ich mir zu 98% sicher das ich keine Daten vom C++ Programm aus an dem MIC senden kann.
SetCommState liefert hin und wieder true und dann auch wieder false zurück das verstehe ich ja gerade deswegen nicht.
MfG
-
Zunächst mal mußt Du den DCB vollständig initialisieren, um beispielweise das Handshaking auszuschalten usw.!
-
Das mache ich doch schon mit GetCommState bzw. SetCommState oder etwa nicht ?
-
mike2003 schrieb:
Da teste ich den boolschen Wert ab.
Nein, tust du nicht. Ich spreche vom Rückgabewert von SetCommState, nicht von SetCommTimeouts.
SetCommState liefert hin und wieder true und dann auch wieder false zurück das verstehe ich ja gerade deswegen nicht.
Dann frag doch mal GetLastError...
-
Ok ich versuchs mal mein Glück. Bekomme ich denn da auch haargenau von GetLastError zurück warum das nicht geht ?
-
mike2003 schrieb:
Das mache ich doch schon mit GetCommState bzw. SetCommState oder etwa nicht ?
Sicher. Kannst Du mir aber sagen, was Du damit einstellst? Wie ist zum Beispeil das Flag fOutX gesetzt? Und was ist mit fRtsControl? Und fTXContinueOnXoff? Usw.? Ist das dann auf meinem Rechner auch so?
Nur wenn die Einstellungen des Zielrechners an Dich angepasst werden, funktioniert Dein Programm einwandfrei. Was aber, wenn jetzt zwischendurch ein anderes Programm den Port öffnet und die Einstellungen ändert?
-
aber es funktioniert doch sonst immer. Ich würde trotzdem mal gerne wissen warum Win mir da keinen gültigen Handle gibt bzw. welches die Ursache dafür ist. In der MSDN steht ausserdem drinne das GetCommState und SetCommState zusammen alle variablen der DCB Struktur vorinitialisieren ich brauche bei mir in diesem Projekt zumindest nur die Baudrate, Startbit, Bitanzahl und Parity in diesem Projekt das gebe ich auch an also muss das doch funzen oder ?
-
mike2003 schrieb:
aber es funktioniert doch sonst immer. Ich würde trotzdem mal gerne wissen warum Win mir da keinen gültigen Handle gibt bzw. welches die Ursache dafür ist.
Ungültiges Handle? Es schlägt also schon CreateFile fehl? Und bevor sich MFK noch schwindelig redet: Prüfe den FehlerCode mit GetLastError.
mike2003 schrieb:
In der MSDN steht ausserdem drinne das GetCommState und SetCommState zusammen alle variablen der DCB Struktur vorinitialisieren ich brauche bei mir in diesem Projekt zumindest nur die Baudrate, Startbit, Bitanzahl und Parity in diesem Projekt das gebe ich auch an also muss das doch funzen oder ?
Ja, es wird vorinitialisiert. Aber bitte womit denn? Wenn Du kein Handshaking benötigst, mußt Du's ausschalten. Sonst kommt da unter Umständen nicht viel raus, aus Deinem Port. Deswegen will ich mich aber garantiert nicht streiten. Wenn das auf Deinem Rechner funktioniert und der Einsatz auf anderen Rechner nicht geplant ist, dann lasse es einfach so falsch wie es ist.
-
Wenn das auf Deinem Rechner funktioniert und der Einsatz auf anderen Rechner nicht geplant ist, dann lasse es einfach so falsch wie es ist.
Ich denke mal die letzte Antwort braucht man nicht zu kommentieren derjenige weis selber das das Schwachsinn ist denn hier wollen wir ja schliesslich das wir vernünftigen Code programmieren oder ich bin hier falsch.
Naja trotzdem vielen Dank an alle die mir geholfen haben
Gruss