SerialPort-Klasse und DataReceived-event... Immer bytes. Die Verwendung mit ReadLine oder ReadExisting? Beispiele dafür?

Ich möchte zum senden und empfangen von bytes über die serielle. Mein receiver erhalten, sollten die bytes asynchron. Ich geschrieben habe das kleine Beispiel unten, die zu funktionieren scheint, aber es hinterlässt bei mir ein unruhiges Gefühl.

  1. Sollte ich wirklich mit WriteLine, ReadLine? Wie es jetzt geschrieben ist, ist es möglich, dass der code in der Ereignisprozedur m_port_DataReceived genannt wird für jedes byte? Das war mein Verständnis des Ereignisses "DataReceived"; vielleicht bin ich falsch. Tut ReadLine blockiert, bis es sieht ein Ende der Zeile-Zeichen?
  2. Sollte ich irgendwie verwenden", wenn (e ist.EventType == SerialData.Eof)" - Konstrukts in der event-handler? Sie können sehen, habe ich es auskommentiert. Ich versuchte es und konnte es nicht zum laufen bekommen. Wann würde man erwarten, dass ein SerialData.Eof? Meine Idee war, dass ich warten konnte, bevor alle bytes vorhanden waren, die vor dem Aufruf von "ReadExisting". Aber die "if" - Anweisung wird nie wahr ausgewertet. Zwingen, den code zu gehen, um ReadExisting hast richtig gelesen, alle die bytes jedoch.
  3. Im Allgemeinen, was ist der beste Weg, um meinen code zu empfangen bytes kommen über die serielle Schnittstelle? Der Absender versenden, die kleine Stücke von Byte alle 125 MS, aber nicht das senden von Sonderzeichen. Die Pakete von bytes beabstandet in der Zeit, also ich glaube nicht, dass es ein problem der Vermischung Pakete zusammen. Mehr das problem ist, "wenn Sie sehen, ein byte, gehen, alles zu Lesen, solange Sie warten eine sehr kurze Zeit, erhalten Sie alles". Angesichts dieses Szenarios, gibt es einen bevorzugten Weg?

Vielen Dank im Voraus,
Dave

public class SerialPortController
{
    SerialPort m_port;

    public SerialPortController(bool server)
    {


        if (server)
        {
            m_port = new SerialPort("COM4"); 
            m_port.BaudRate = 115200;
            m_port.Open();
            byte[] sillyBytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
            ASCIIEncoding encoding = new ASCIIEncoding();
            string output_string = encoding.GetString(sillyBytes);
            m_port.WriteLine(output_string);
            //m_port.Write(sillyBytes, 0, 8);                  
        }
        else
        {
            m_port = new SerialPort("COM5"); 
        m_port.DataReceived += new SerialDataReceivedEventHandler(m_port_DataReceived);
            m_port.BaudRate = 115200;
            m_port.Open();
        }
        int character = Console.Read();
    }

    void m_port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        //if (e.EventType == SerialData.Eof)
        {
           //string answer = m_port.ReadExisting();
            string answer = m_port.ReadLine();
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] byte_answer = encoding.GetBytes(answer);

        }
    }
}
Unter der Annahme, dass die Eigenschaft ReceivedBytesThreshold = 1, (das ist der Standard, und es scheint nicht, dass Sie es geändert haben), dann die DataReceivedEvent Feuer, wenn es ist mindestens 1 byte zu erhalten. Es kann auch mehr sein. Dies ist nicht das gleiche wie das auslösen von Ereignissen für alle byte empfangen. Es bedeutet, dass, wenn es nicht Feuer ist, wird es mindestens 1 byte.
Der Ansatz, den ich schon immer verwendet, ohne problem, ist das Lesen der Daten als byte-array, wenn die DataRcvd-handler feuert. Ich Schiebe die Puffer byte-array in eine Warteschlange. Wenn ich die Daten, die ich Stück es wieder zusammen und verwenden Sie ihn / es zu konvertieren ... Abhängig von der Anwendung, die ich führen Sie einen der folgenden Schritte aus: 1 - DataRcvd-handler ein Ereignis auslöst, auf den UI-thread; 2 - verwenden Sie einen timer; 3 - DataRcvd handler ruft eine Methode auf dem UI-thread.

InformationsquelleAutor Dave | 2010-11-20

Schreibe einen Kommentar