Autor Beitrag
ujo
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 17.06.09 08:53 
Hallo,
ich habe folgendes Problem und bin leider im Netz auch nicht richtig fündig geworden.
Ich spreche über eine Com Schnittstelle ein SMS Modem an. Schreibe ich nun über SerialPort.Write in den Outputstream, warte, und lese den Input Stream
ist dieser leer. Erst wnn ich erneut in den Outputstream schreibe sehe ich im Input die Antwort des Befehls zuvor.

Eine Kontrolle mittels Telnet zeigt mir dass der Outputstream, nachdem ich im Programm diesen beschrieben habe, scheinbar nicht direkt gesendet wird (ich sene im Programm, warte bis zum vermeintlichen lesen, schliesse das Programm und starte Telnet. Dort sehe ich dann den Befehl und die Antwort).

Write schreibt wohl nicht direkt an das Gerät sondern erst in den Puffer und schickt diesen bei erneuter Nutzung an das Gerät.

Hat jemand eine Idee wie ich dieses Verhalten ändern kann?

Danke schonmal.

lg
Anti
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 26.05.10 19:40 
hey,
hab eine Lösungsmöglichkeit.
der Thread ist zwar schon älter aber vlt. hilft es ja irgendjemand anderst weiter, der das gleiche Problem hat und zufällig auf den Thread stößt.

Also ich hab das dadurch gelöst, dass ich einen extra StreamWriter erstellt hab:

SerialPort sp = new SerialPort("COM3"); //Das "COM3" mit deinem ComPort ersetzten^^
StreamWriter str = new StreamWriter(sp.BaseStream);

und dann halt:

str.Write("Hier steht der Befehl");
str.Flush();

MFG
Anti ;)
Anti
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 03.06.10 00:02 
hi nochmal^^
hab noch was wichtiges gefunden, wie man das Problem auch lösen kann. Also die Möglichkeit in meinem vorherigenPost geht auch aber so macht man das richtig:
Und zwar um einen Befehl zu senden oder einem Gerät zu sagen, dass es den Befehl jetzt ausführen soll benötigt man am Ende des Befehl ein "Carriage-return" (zu deutsch heißt es "Wagenrücklauf"). Das "Carriage-return" ist die Char 13 des ASCII-Zeichensatzes oder auch einfach "\r".
im Programm sieht dass dann so aus...
entweder:
ausblenden C#-Quelltext
1:
2:
SerialPort serialport = new SerialPort("COM3");
serialport.WriteLine("mein befehl"+ (char)13);


oder:
ausblenden C#-Quelltext
1:
2:
SerialPort serialport = new SerialPort("COM3");
serialport.WriteLine("mein befehl\r");


da sehr viele Geräte das "Carriage-return" brauchen, hab ich jetzt das doch nochmal gepostet!

MFG Anti