Forum: PC-Programmierung Serielle Schnittstelle


von Christian Woltz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe ein Programm in C geschrieben welches mir Datenpakete die an
der seriellen Schnittstelle ankommen auswertet.
Nun habe ich das Problem das ab und zu eine 0 gelesen wird, die aber
nicht vorhanden ist bzw. sein soll.

Ich finde da keinen Fehler,
anbei mal die Lese Funktion villeicht findet von euch den Fehler ...

von Alex (Gast)


Lesenswert?

Hast du nen Wackler am Kabel? RS232 ist da immer sehr empfindlich, das
Prellen eines Kontaktes reicht oft schon für solche Effekte aus.

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Null mal den DCB vor der benutzung. Es könnte sein, dass dir da noch
irgendein Müll drinsteht, der dir ungewollte FUnktionen aktiviert

von Wolfram (Gast)


Lesenswert?

oder besser schau dir den DCB an den du benutzt, wenn Fehler bei der
Übertragung auftreten kann ein Füllzeichen eingestellt werden, das
statt des Fehlers eingefügt wird. Im übrigen solltest du überprüfen was
die Funktionen zurückliefern, das können nämlich Fehler ,ala kann
Comport nicht öffnen...

von Christian Woltz (Gast)


Lesenswert?

Was mich halt irritiert ist, das es nur eine 0 ist und nur ab und zu.
Einen Wackler kann ich ausschliesen, werde es aber nochmal testen
sicher ist sicher ...

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Wie Wolfram schon sagte hast du evtl eine Funktion aktiviert, die die
Fehlerhafte Bytes (z.b Parity Fehler, denn das hast du ja aktiviert)
mit einem bestimmten, einstellbaren Fehlermarker ersetzt. In deinem
Fall wäre das dann die 0. Um das auszuschiessen, sollte man ALLE
Datenstrukturen, die man nicht vollständig ausfüllt vor der benutzung
auf 0 setzten

von Wolfram (Gast)


Lesenswert?

oder den Fehler für die fehlerhafte Übertragung finden, bei 19200 und in
1. Test und du siehst jetzt schon Fehler da wird es nicht sehr schön
Daten zu übertragen. Wenn es ein Mikrocontroller ist, der an den PC
sendet, würde ich sagen du bist einer der versucht mit keinem
Baudratenquarz zu arbeiten sondern mit internen Oszillator. Das
funktioniert aber es kommen dann halt so alle 5..20 Zeichen ein
Fehler,
besonders wenn man nur mit 1 Stopbit arbeitet.
Bei der Schnittstelleninitialisierung solltest du noch die Puffergröße
festlegen und wenn du auf Geschwindigkeit kommen willst, lies die Daten
im Block und nicht einzeln.

von Andreas S. (andreash)


Lesenswert?

Ich habe mir Dein Programm nicht im Detail angesehen sondern nur kurz
mit dem was ich vor längerer Zeit mal gemacht habe verglichen.

Bei mir ist es so: SetCommState(iCommId,&fDCB)
Bei Dir aber dagegen: SetCommState(&iCommId,&fDCB)

Ausserdem würde ich nicht eingabe zurückgeben sondern auch überprüfen
ob tatsächlich ein Zeichen gekommen ist (dwRead).

Weiss nicht ob einer der beiden der Fehler ist.

Grüße
Andreas

von Christian Woltz (Gast)


Lesenswert?

Hi,
also dwRead liefert immer ne 1... Also werden Zeichen auch gelesen .

Ein Error Char hab ich ja auch nicht definiert. Von daher dürfte das
auch nicht sein, oder ist evt. Standart ?

Wie kann ich den Puffer eigentlich vergrößern ?

@ Wolfram
Meinst Du es wäre besser anstelle eines Bytes z.b. gleich 10 zu lesen ?
Hätte halt den Vorteil das die Funktion nur jedes 1o. mal aufgerufen
wird und damit 'Zeit' spart.

Gruss

Christian

von Christian Woltz (Gast)


Lesenswert?

Hi,
habe den Puffer vergrößert nun klappt es. Ausserdem habe ich in der
Initialisierung folgendes eingefügt:
dcb.fAbortOnError = 1;
um sicher zu gehen das er bei einem Fehler auch abricht und nicht sonst
was veranstaltet ....

Danke für eure Hilfe und Hinweise ;-)))

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.