Forum: PC-Programmierung RS232 COM Schnittstelle Daten empfangen


von Dave_ (Gast)


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

von domi (Gast)


Lesenswert?

Wie sieht denn dein CreateFile(..) aus?

Bei mir blockiert das ReadFile(..) nämlich nicht.

Domi

von Dave_ (Gast)


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



von Wolfram (Gast)


Lesenswert?

sowas nennt sich Timeout

von Blackbird (Gast)


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

von Florian F. (e-lore)


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.

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
Noch kein Account? Hier anmelden.