Serialport -> Warten bis Bytes gesendet wurden
-
Hallo,
ich möchte über den SerialPort kontinuierlich Daten senden, jedoch krieg ich es nicht hin, dass möglichst keine Daten im Empfangspuffer stehen. Das ganze ist für eine LED-Ansteuerung, bei der die Helligkeit vom PC aus gesteuert wird. Wenn man nun am PC die Farbe einstellt, soll das natürlich auch möglichst schnell bei den LEDs ankommen.
So sieht der Code zum Senden bisher aus (wird in einem eigenen Thread ausgeführt)://... private SerialPort sp = new SerialPort("COM1", 75, Parity.Even, 8, StopBits.One); //... public void Send() { try { if (ReturnData != null) ReturnData("Initialisieren"); //Gibt Rückmeldung an das Form sp.Open(); while (running) //solange Daten senden, bis von extern die Eigenschaft auf false gesetzt wird { tmpColor = colors; //colors ist ein Bytearray (4 Bytes), welches Farbinformationen enthält //in ne Temporäre Variable kopieren try { if (ReturnData != null) ReturnData("Daten Senden"); sp.Write(tmpColor, 0, 1); //nur das erstes Byte senden (zum testen) } catch (Exception e) { if (ReturnData != null) ReturnData("Fehler: "+ e.Message); running = false; Thread.Sleep(10000); //Damit man die Nachricht erst mal Lesen kann } if (ReturnData != null) ReturnData("Warten"); } if (ReturnData != null) ReturnData("Der Thread wird beendet"); } catch(Exception e) { if(ReturnData!=null) ReturnData(e.Message); } sp.Close(); if (ReturnData != null) ReturnData("Thread beendet"); }
Folgendes passiert nun im Programm:
Ich starte das Programm, drücke auf den button, um das Senden zu starten. Über LEDs sehe ich, dass auch etwas gesendet wird. Dass es die richtigen Daten sind, nehme ich mal an;)
Wenn ich das ganze dann stoppe, wird nach kurzer Zeit angezeigt, dass der Thread beendet ist. Es werden aber noch viele Sekunden länger Daten ausgegeben, selbst wenn ich das Programm direkt mit dem Debugger abschieße, werden noch weiter Daten ausgegeben. Scheinbar im Sendepuffer noch jede Menge krams drin.
Da ich in dem Programm die Daten über Scrollbars verändern will, sollten die neuen Daten auch sofort rausgeschickt werden und nicht erst der ganze Puffer abgearbeitet werden.
Am liebsten wäre es mir, wenn vor dem Schreiben eines neuen Bytes sichergestellt ist, dass das alte gesendet wurde.
Weiß jemand womit das zusammenhängt?
-
Mittels der SerialPort.BytesToWrite-Eigenschaft könntest du mal überprüfen, ob wirklich noch Daten im Sendepuffer stehen. Und falls ja, diese mit der SerialPort.DiscardOutBuffer-Methode löschen.
Dies steht aber auch alles in der MSDN: http://msdn.microsoft.com/de-de/library/system.io.ports.serialport_members.aspx