RS232 funktioniert erst nach Verbindung mit HyperTerminal
-
Hallo zusammen.
Folgendes Problem. Ich hab mir eine Klasse geschrieben welche anhand CreateFile(...), ReadFile(...) und WriteFile(...) mit einem externen Gerät über AT Befehle kommuniziert.
Ahnendfürsich klappt alles wunderbar, jedoch funktioniert die Verbindung erst wenn ich zuerst bereits mit HyperTerminal auf das Gerät verbunden habe. Mach ich das nicht bekomme ich keine (sinnvolle) Antwort. Sobald ich einmal mit HyperTerminal verbunden und wieder getrennt habe funktioniert es ohne Probleme, bis zum nächsten restart des Computers.
Eine Ahnung woran das liegen könnte?
OS: Win2000
Compiler: VC++ 6.0Besten Dank
Saimen
-
Dieser Thread wurde von Moderator/in davie aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ich wollte mein Problem nicht nochmal schildern. Deshalb hab ich diesen alten Thread herausgekrammt.
Ich genau dasselbe Problem wie oben erwähnt. Gibt es da irgendeine Lösung?
-
Wie initialisierst du denn die Schnittstelle - evtl. hilft etwas Code weiter?!
-
Hier mal der code;
COMMTIMEOUTS cto; //Comm Time-out DCB dcb; //Data Communication Block cto.ReadIntervalTimeout = 1000; cto.ReadTotalTimeoutConstant = 1000; cto.ReadTotalTimeoutMultiplier = 1000; dcb.BaudRate = CBR_9600; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.ByteSize = 8; HANDLE hCom = CreateFile("COM1",GENERIC_READ,0,0,OPEN_EXISTING,0,0); SetCommTimeouts(hCom,&cto); SetCommState(hCom,&dcb); if(hCom == INVALID_HANDLE_VALUE) {try {ShowMessage("Error!\nCode: " + AnsiString(GetLastError())); } catch (...) {Application->MessageBox("Fehler ist aufgetreten!\nUrsache konnte nicht ermittelt werden!","Attention",MB_OK); } CloseHandle(hCom);//Wenn das Handle nicht erstellt werden kann return; //wird eine Fehlermeldung angezeigt und der Thread beendet } unsigned long dwBytesRead = 0; unsigned long dwAllBytesRead = 0; FreeOnTerminate = true; PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);//Buffer Inhalt wird gelöscht char buff[50]; while(1) //Endlos Schleife {//Überprüfung ob bits im Puffer gespeichert sind. Wenn ja werden sie engelesen //sonst wird auf weitere bzw. neue gewartet. Wird der Thread in der Zwischenzeit //geschlossen wird auch die Endlosschleife beendet. if(Terminated == true) {CloseHandle(hCom); return; //wenn der Thread beendet wurde Endlosschleife abbrechen } ReadFile(hCom, buff, 50, &dwBytesRead, NULL);//Versuch etwas von der Schnittstelle einzulesen //Hier folgt noch etwas code, der verarbeitet jedoch nur mehr die Daten deshalb hab ich ihn auch nicht hierher kopiert.
Hoffe das hilft.
-
Hallo,
Saimen hat das PurgeComm() vergessen.
-
Nicht nur die Buffer leeren, sondern auch die Pins RTS und DTR (wenn nötig) setzen. Da meistens mit einem Cross-Link-Kabel (Null-Modem-Kabel) gearbeitet wird, ist RTS oder DTR mit CTS des Remote RS232-Gerätes verbunden. Und über CTS wird bestimmt, ob die Übertragung beginnen darf oder nicht.
Ist nicht immer so, ist geräteabhängig.Blackbird
-
Ich hab jetzt den code um diese Zeilen erweitert;
dcb.fDtrControl = DTR_CONTROL_ENABLE; //DTR (Data terminal ready) wird enabled dcb.fRtsControl = RTS_CONTROL_ENABLE; //RTS (Request to send) wird enabled
Also wenn das richtig war dann hat es leider trotzdem nichts genützt. Ich empfangen weiterhin alles andre als das was ich sende.
Und nachdem der hyperterminal offen ist und ich ein paar zeichen verschicke geht es wieder.
damn. Need more hlp!
-
Dann sende doch selber erst mal ein Dummy-Byte?
Wenn Du DTR_CONTROL_ENABLE und RTS_CONTROL_ENABLE einstellst, dann wird ja die Übertragung abhängig von den Controls!
Entweder ..._DISABLE oder Setzen der PIN mit EscapeCommFunction (hPort, SETRTS); und EscapeCommFunction (hPort, SETDTR);
Oder auch rücksetzten mit ... CLRDTR und CLRRTS.Blackbird