Hallo zusammen, habe mir das Buch: "Windows Programmierung(Petzold) Entwicklerhandbuch für Win32 API" bestellt. Heute ist es angekommen. 1300 Seiten stark und nichts über die serielle Schnittstelle! Okay also schluss mit meiner Lebensgeschichte ;) Ich habe die serielle Schnittstelle bereits programmiert. D. h. mein µC sendet Daten an den PC und ich kann diese dann weiter in einem Programm verwenden. Jetzt kommt aber das Problem. Der Port aktuallisiert sich nicht von selbst. Meine bisherige Methode ist das ständige öffnen und schließen des Ports, was natürlich Zeit kostet die ich gerne einsparen würde. Kann mir jemand bei meinem Problem helfen? Würde mich freuen wenn jemand von den Profis mir einen Hinweis oder gar die Lösung gibt. Beste Grüße Bobo
Bobo schrieb: > Jetzt kommt aber das Problem. Der Port aktuallisiert sich nicht von > selbst. Meine bisherige Methode ist das ständige öffnen und schließen > des Ports, was natürlich Zeit kostet die ich gerne einsparen würde. was meinst du mit "Der Port aktuallisiert sich nicht von selbst" kommen keine Daten an? zeigt mal etwas quellcode, dann kan man ja vielleicht sehen wo der fehler ist.
Hallo Peter, es kommen immer die gleichen Daten an. Achtung der Programmcode ist recht groß zum darstellen. (Programmsprache C++, mit Borland Compiler) //------------------------------------- // DEFINITIONEN AM ANFANG // ------------------------------------ // globale Daten DCB dcb; // Device Control Block HANDLE hCom; // einfacher Datentyp für Schnittstelle COMMTIMEOUTS timeouts; // System abhängige Definition BOOL fSuccess; // vordefinierter Datentyp DWORD BytesRead; // vordefinierter Datentyp const int BAUD = 9600; //------------------------------------- // FUNKTION ZUM ÖFFNEN // ------------------------------------ void TUser::PortOeffnen(){ /* BEGIN des INIT-BLOCKs der seriellen Schnittstelle */ // Öffnen der Schnittstelle, Definitionen siehe oben! hCom = CreateFile( ComPort, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile ); // direktes Fehler abfangen der CreatFile-Funktion PERR(hCom != INVALID_HANDLE_VALUE, "CreateFile"); if (hCom != INVALID_HANDLE_VALUE){ // Was liefert GetCommState? fSuccess = GetCommState(hCom, &dcb); PERR(fSuccess, "GetCommState"); // COM-Port einrichten --> Device Control Block dcb.BaudRate = BAUD; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.fDtrControl = DTR_CONTROL_ENABLE;//DISABLE; dcb.fInX = FALSE; // Was liefert SetCommState? fSuccess = SetCommState(hCom, &dcb); PERR(fSuccess, "SetCommState"); // Was liefert GetCommTimeouts? fSuccess = GetCommTimeouts (hCom, &timeouts); PERR(fSuccess, "GetCommTimeouts"); /* Set timeout to 0 to force that: If a character is in the buffer, the character is read, If no character is in the buffer, the function do not wait and returns immediatly */ timeouts.ReadIntervalTimeout = MAXDWORD; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.ReadTotalTimeoutConstant = 0; fSuccess = SetCommTimeouts (hCom, &timeouts); PERR(fSuccess, "SetCommTimeouts"); } else return; /* ENDE des INIT-BLOCKs der seriellen Schnittstelle*/ return; } //-------------------------------------------------------------------- Ich hoffe das waren die relevanten Stellen. BG Bobo
und wo ist das lesen der schnittstelle? Wenn du den Timeout auf 0 setzt dann liefer vermutlich read als anzahl meist 0 zurück und du verwendest du alten daten, kann das sein?
Daten einlesen: //---------------------------------------------------------------------- -- if (ReadFile ( hCom, &dateneingang, 1, &BytesRead, NULL)){ CallRun=true; ui_daten = (unsigned int)dateneingang; // Daten in unsigned int wandeln; if (ui_daten > 255) { ui_daten -= 4294967040; // Berechnet wird der korrekte 8-Bit-Wert } //---------------------------------------------------------------------- -- CallRun braucht nicht beachtet werden, dient nur meiner Steuerung. Also ReadFile liefert keine 0 zurück, da ich damit die IF-Abfrage steuere.
verwendest du denn BytesRead? Dort steht drin wie viele bytes er gelesen hat, wenn dort 0 steht dann wurde nicht gelesen und die funktion war drozdem erfolgreich.
> timeouts.ReadIntervalTimeout = MAXDWORD; > timeouts.ReadTotalTimeoutMultiplier = 0; > timeouts.ReadTotalTimeoutConstant = 0; ich habe jetzt nich genau in der doku nachgelesen, du setzt zwar das timeout auf maximum aber den Multiplikator auf 0 -> MAX * 0 = 0 Lass das ändern der Timeouts mal weg, es geht in vielen fällen auch ohne.
Also ich verwende kein BytesRead... Das mit den TimeOuts werde ich machen. Habe leider die Schaltung gerade nicht hier um das auszutesten. Wenn dir nochetwas einfällt wäre eine Mitteilung super. Kannst du mir ein Buch empfehlen, was auf die Serielle Schnittstelle eingeht?
Bobo schrieb: > Kannst du mir ein Buch empfehlen, was auf die Serielle Schnittstelle > eingeht? nein, denn ich finde die MSND-Doku mehr als ausreichend. Aber man sollte lieber nicht die Deutsche version verwenden, weil sie teilweise unvollständig ist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.