www.mikrocontroller.net

Forum: PC-Programmierung RS232 COM Schnittstelle Daten empfangen


Autor: Dave_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: domi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht denn dein CreateFile(..) aus?

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

Domi

Autor: Dave_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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



Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sowas nennt sich Timeout

Autor: Blackbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Fischer (e-lore)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.