Laden...

SerialPort einzelnes Zeichen sicher senden?

Erstellt von SkySurfer vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.594 Views
S
SkySurfer Themenstarter:in
298 Beiträge seit 2006
vor 13 Jahren
SerialPort einzelnes Zeichen sicher senden?

Hi,

ich versuche gerade mit .net 2.0 und SerialPort eine serielle Kommunikation aufzubauen und bin dabei unter XP auf folgendes Problem gestoßen, welches auf meinem Win7 Rechner erst garnicht auftritt:


serialPort.Write("V");
char c = (char)serialPort.ReadChar(); // read echo

wirft ReadChar ein Timeout weil Write das Zeichen wohl noch nicht gesendet hat.

Bisher hab ich versucht dazwischen ein

serialPort.BaseSteam.Flush();

oder ein

Thread.Sleep(time);

aufzurufen beides ohne Erfolg. Der Writebuffer wird nicht übertragen.

Dabei den versuchen habe ich noch ein sehr Merkwürdige verhalten entdeckt:

wenn man

serialPort.WriteBufferSize = 1; 

setzt bekommt man beim Open() eine Exception, dass der Port nicht geöffnet werden kann. serialPort.IsOpen meldet aber true. Und man kann danach auch senden und empfangen. Und da der Puffer nach einem Zeichen voll ist wird er auch übertragen. Seitzt man die WriteBufferSize = 2 tritt beim Open() keine Exception auf jedoch wird dann auch das einzelne Zeichen nicht mehr gesendet.

Das lustige an der Geschiche: MSDN sagt zu WriteBufferSize Werte unter 2048 werden ignoriert...

Möchte also nicht unbedingt die Exception wegfangen und drauf hoffen das dieser "Fehler" auf jedem System funktioniert.

Gibt es eine Möglichkeit ein Zeichen sicher abzusenden, welche sowohl unter XP als auch Win7 funktioniert?

Gruß SkySurfer

Es gibt 11 Arten von Menschen:

  • Die, die binär verstehen
  • Die, die es nicht tun
  • Die, die Witze darüber machen
E
395 Beiträge seit 2007
vor 13 Jahren

hey,

bau das empfangen bitte eventbasiert auf
schau dir dazu dein serieles objekt an da wirste finden was ich meine.

MfG Paul

S
SkySurfer Themenstarter:in
298 Beiträge seit 2006
vor 13 Jahren

Generell gebe ich dir recht in echten Anwedungen sollte man mit Events arbeiten..
das oben war auch nur ein Beispiel zum nachvollziehen.

Das Problem ist durch Events aber nicht gelößt.. da es kein Event gibt das einem meldet, dass etwas gesendet wurde und sich das Senden damit auch nicht forcieren lässt. Und das Hauptproblem nicht ist, dass ich ein Timeout beim empfangen bekommen,
sondern dass das Zeichen erst garnicht rausgesendet wird. Problem scheint bei XP zu sein, dass erst ab mehr als einem Zeichen im Puffer gesendet wird.

Habe mir jetzt mit dem Hack beholfen die WriteBufferSize auf 1 zu setzen, beim Öffnen abzuprüfen, ob die Verbindung offen ist und wenn ja die Exception zu unterdrücken. Und anstatt

serialConnection.Write("V"); 

verwende ich

serialPort.Write(new char[] { 'V' },0 ,1);

in dieser Kombination läuft das Übertragen von einzelnen Zeichen sowohl unter XP als auch auf Win7.

Gruß SkySurfer

Es gibt 11 Arten von Menschen:

  • Die, die binär verstehen
  • Die, die es nicht tun
  • Die, die Witze darüber machen
T
12 Beiträge seit 2010
vor 13 Jahren

Hallo,

hab ein ähnliches problem...
kommunizier mit einem Gerät.
folgende Reihenfolge wird immer eingehalten:

  1. Befehl senden
  2. Befehl empfangen
  3. Wert senden

Muss eine Char wert senden!
Bekomme keine Antwort von dem Gerät?

Wie verwende ich die Serialport-Klasse am besten? kenn mich noch nicht aus?

THX