RS232 COM Schnittstelle Daten empfangen

Gast #439775
Lesenswert?

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
Gast #439825
Lesenswert?

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


Gast #440461
Lesenswert?

  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
#442654
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren