Hallo zusammen, Wie kann ich bestimmen, daß mein COM Port Daten empfangen hat? Bei mir springt er zur funktion ReadFile (hCom, &InString, sizeof (InString), &dwRead,NULL); und bleibt dort hängen. Ich hätte es gerne damit er in einer Schleife z.b 10 mal das Com Port abfragt und dann evnl. nochmal eine nachfrage sendet oder evntl. was anders, danach wieder das Com Port abfragt usw. Warum bleibt er bei mir immer beim ReadFile hängen, bis er irgendwelche daten kriegt? Mfg Davie
Wie sieht denn dein CreateFile(..) aus? Bei mir blockiert das ReadFile(..) nämlich nicht. Domi
Das ist mein Crate File. HANDLE hCom = CreateFile ("COM1", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); Zur info. Das empfangen der Daten geht bei mir allerdings nicht so wie ich es mir vorstelle. Ich habe eine Verbindung zum Controller welcher daten an den PC sendet. Bei mir spring das Programm zum READFILE und wartet bis was ankommt. Es sollte aber nur eine zeit warten und dann evntl eine nochmallige abfrage senden. Wie kann ich das programmieren? Mfg David
DCB dcb; COMMTIMEOUTS ct; dcb.DCBlength = sizeof(DCB); // Laenge des Blockes MUSS gesetzt sein! GetCommState (hCom, &dcb); // COM-Einstellungen holen und aendern dcb.BaudRate = BD_RATE; // Baudrate dcb.ByteSize = 8; // Datenbits dcb.Parity = NOPARITY; // Parität dcb.StopBits = ONESTOPBIT; // Stopbits SetCommState (hCom, &dcb); // COM-Einstellungen speichern GetCommTimeouts (hCom, &ct); // Warte-Zeit [ms] vom Beginn eines Bytes bis zum Beginn des nächsten Bytes ct.ReadIntervalTimeout = 1000 / BD_RATE * (dcb.ByteSize + (dcb.Parity == NOPARITY ? 0 : 1) + (dcb.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; SetCommTimeouts (hCom, &ct); // Zwischenspeicher des serial-Drivers einstellen (für read und write): SetupComm (hCom, COM_BUFFER_SIZE, COM_BUFFER_SIZE); SetCommMask (hCom, dwSetMask); // Empfangssignale definieren Code-Schnipsel zum Einstellen der Timeouts. Sind nur Beispiel. Blackbird
Hallo zusammen! Habe mich jetzt schon eine ganze Weile hier umgesehen und festgestellt, daß ich hier wohl goldrichtig bin :) Ich habe mit Beispielcode aus genau derselben Ecke experimentiert und zumindest kleinere Erfolge gefeiert. Aber von Anfang an: Ich versuche zur Zeit ein Modul via rs232 Schnittstelle zu steuern. Dabei gehen Datenpakete geformt nach einem vorgegebenen Protokoll hin und her (keine Flow control, 8 BIT Wörter, keine parität, 1 Stopbit, kann auf 115200 Baud angesprochen werden) Dafür nutze ich VC++6SP6, vermeide aber OO, da das ganze evtl ebenfalls auf einen MC portiert werden soll. Nun habe ich da ein paar seltsame Effekte. 1. ich bekomme keine oder nur teilweise Antwort vom Modul, wenn ich mein Testprogramm das 1. Mal starte. Danach funzt es einwandfrei. 2. Wenn ich den Comport nicht einmal öffne und gleich wieder schliesse, habe ich den effekt, daß mein Programm das "Ack" Paket verschluckt (1 Byte) und sich damit der empfang verschiebt und am ende mein CRC8 Paket nicht mehr stimmt (wird hinten angehängt). 3. bei einem gerade heute getesteten Datenpaket bekomme ich nur jeden 4. bis 5. Programmstart eine Antwort. 4. wenn ich die Timeout Werte erhöhe, dann wird der Timeout ab einem bestimmten Wert nicht mehr wirklich ehrhöht..ein Timeout von z.B. 5 Sekunden ist nicht mehr möglich, wäre aber wünschenswert..für Testzwecke wäre es vielleicht sogar gut den Timout, wie oben ungewollt schon geschehen, mal ganz auszuschalten. Ich habe die vermutung, daß die Probleme irgendwie mit dem Timing zusammenhängen. Vielleicht speichter das Readfile auch irgendwelchen Müll, der dann teilweise noch mit ausgelesen wurde. Ich weiss einfach zu wenig von der API, die ich da anprogrammiert habe. Leider habe ich grundsätzlich sehr wenig über dieses Thema gefunden. Gibt es irgendwo eine Seite, die genau diese umschreibt mit allen Optionen, die möglich sind? Vielen dank schonmal für eure antworten ohja...noch zur Info: ich bin nicht der absolute C bzw C++ Spezialist und, wie man dem Kontext entnehmen kann, auch noch ein relativ unbeschriebenes Blatt, was die RS232 Kommunikation angeht.
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.