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 ...
Hast du nen Wackler am Kabel? RS232 ist da immer sehr empfindlich, das Prellen eines Kontaktes reicht oft schon für solche Effekte aus.
Null mal den DCB vor der benutzung. Es könnte sein, dass dir da noch irgendein Müll drinsteht, der dir ungewollte FUnktionen aktiviert
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...
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 ...
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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.