Laden...

Kommunikation über UART (USB, RS232)

Erstellt von zoniq vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.576 Views
Z
zoniq Themenstarter:in
5 Beiträge seit 2007
vor 16 Jahren
Kommunikation über UART (USB, RS232)

Hallo,

ich bekomme von einem Mikrocontroller einzelne Bytes (Anzahl unterschiedlich; mal 1, mal 2, mal 10) zugeschickt.

Den Empfang habe ich soweit auch hinbekommen:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
     byteVar = (byte)serialPort1.ReadByte();
    myQueue.Enqueue(bytVar);
}

Allerdings möchte ich das ganze jetzt nicht in ein Byte schreiben, sondern wenn z.B. 10 Bytes auf einmal kommen in eine Art Buffer, von dem aus ich dann einzelne Bytes analysieren kann.

Ich wüsste wie ich das mit der "unsafe"-Methode (Pointer) hinbekomme, würde aber gerne eine saubere Lösung bevorzugen. Allerdings bin ich noch recht unvertraut mit der ganzen C# .NET Sache. Ich habs schon mit einer Queue probiert, dort war dann auch die Anzahl der Elemente vorhanden. Sobald ich es aber in ein Array kopiert habe und auf ein einzelnes Element zugegriffen habe, hatte dieses immer den Wert 0.


private void buttonDebug_Click(object sender, EventArgs e)
        {
            MessageBox.Show(myQueue.Count.ToString());
            int length = myQueue.Count;
            byte[] byteArr = new byte[length];
                    
            myQueue.CopyTo(byteArr, myQueue.Count);

            MessageBox.Show(byteArr[0].ToString() + byteArr[1].ToString() + byteArr[2].ToString());    // hier bekomme ich z.B. "000" als Ausgabe, was aber nicht sein sollte


            myQueue.Clear();

          

        }


Kann mir vielleicht jemand ein paar Tipps geben?

Vielen Dank

A
254 Beiträge seit 2007
vor 16 Jahren

Hallo,

generell sollte die SerialPort Klasse dafür alles mitbringen.

Die Klasse hat die Eigenschaft ReceivedBytesTreshold, wenn Du diese Eigenschaft auf 10 setzt. Wird die DataReceived Methode erst ausgeführt, wenn 10 Bytes angekommen sind.

Danach kannst Du die Daten auslesen.

byte[] empf = new byte[port.BytesToRead];
int a = port.Read(empf, 0, port.BytesToRead);

Ich muss allerdings zu geben, dass ich in einer Applikation von mir, doch einen separaten Empfangs-Thread programmiert habe, da ich mit diesem Vorgehen meine Applikation beim Beenden plötzlich auf keine Eingabe mehr reagiert hat.

Bin gespannt, ob es bei Dir so klappt.

Bin übrigens auch im µC Umfeld unterwegs. Was machst Du den da so für Dinge ?

Tschüss

S
8.746 Beiträge seit 2005
vor 16 Jahren

Du solltest im Eventhandler soviele Bytes lesen wie da (!) sind. Dazu gibts die Funktion SerialPort.ReadExisting(). Dann in einer Schleife in deine Queue einhängen.