serielle Übertragung - Ereignis auslösen lassen bie bestimmtem Zeichen ?

23/11/2008 - 10:22 von Nicolas Nickisch | Report spam
Hi NG,
ich hoffe, dass subject macht ein wenig neugierig auf mein Problem.

Nach Studium der Online-Hilfe zum serial-Control in VS2008 glaube ich, dass
mein Problem eher nicht so zu lösen ist wie ich es mir wünsche, aber ehe
ich eine andere Lösung suche frage ich einfach mal.

Ein medizinisches Geràt sendet über eine serielle Schnittstelle
'Telegramme'.
Dies telegramme beginnen jeweils mit 2 Zeichen 0x01, dann kommt die
eigentliche Information, eine Checksumme und endet mit dem Zeichen 0x17.
Innerhalb des Telegrammes tauchen die Steuerzeichen prinzipbedingt nicht
auf.

Die Telegramme sind zwischen 6 und 30 Zeichen lang, daher scheint es nicht
unbedingt ratsam mit ReceiveTreshold ein Limit festzulegen- habe ich schon
ausprobiert.
Wenn ich beispielsweise nach 6 Zeichen ein Ereignis auslösen lasse, dann ist
zum Zeitpunkt des Ereignisses u.U. die 30Zeichen lange Nachricht noch
unvollstàndig übertragen.
Andere Technik wàre nach JEDEM Zeichen ein Ereignis auslösen zu lassen und
solange Zeichen zu sammeln bis 0x17 empfange wurde.

Eleganter wàre, wenn ich festlegn könnte, dass ein Ereignis erst dann
ausgelöst wird wenn 0x17 empfangen wurde.
Vielleicht habe ich ja etwas übersehen und dies geht doch.

Gruss Nico
 

Lesen sie die antworten

#1 Karsten Sosna
23/11/2008 - 11:02 | Warnen spam
Dies telegramme beginnen jeweils mit 2 Zeichen 0x01, dann kommt die
eigentliche Information, eine Checksumme und endet mit dem Zeichen 0x17.
Innerhalb des Telegrammes tauchen die Steuerzeichen prinzipbedingt nicht
auf.


Hallo Nicolas,
damit hast Du doch die Information die brauchst. Grundsàtzlich findet die
Übertragung über serielle Schnittstelle asynchron statt. Erst das
Protkoll(Telegramm) ermöglicht den Datenstrom zu synchronisieren.
Du brauchst also nur im SerialPort.DataReceived-Event nur ein Queue anlegen
die erstmal alle Daten aufnimmt. Dann gehst Du durch die Queue und such
nacht den entsprechenden Steuerzeichen(&H01 und &H17). Durch diese Zeichen
kannst Du die eigentliche Information isolieren. Ist eine Information
komplett feuerst Du ein Event(bspw. Information_Received).
Beachte das eine Information verloren gegangen sein könnte, auch hier muss
man versuchen den Datenstron zu synchronisieren.
Gruß Scotty

Ähnliche fragen