Serialport nach Byte Array Hilfe!!! Wie bekomme ich das hin?

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ebrithil.

    Serialport nach Byte Array Hilfe!!! Wie bekomme ich das hin?

    Also ich hab folgendes Problem:

    An meiner Seriellen Schnittstelle kommen Bytes an, die in der Reihenfolge in der sie ankommen in ein 256 Byte großes geschrieben werden sollen.

    Eine Byte-Variable soll dabei als Zähler von 0 - 255 zählen, damit ich immer weiß wie voll mein Array ist und wann ein Befehl fertig ist.

    Bis jetzt sah meine Empfangsroutine immer so aus:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. inputData = inputData + SerialPort1.ReadExisting '//oder SerialPort1.ReadLine
    3. End Sub


    wobei inputData ein globaler String ist.

    Wie bekomme ich es jetzt hin, dass er mir immer alle Bytes die er empfängt in ein Array schreibt?


    Mfg bimbo385
    Lies zunächst die Anzahl der vorhandenen Bytes aus:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim ToRead As Integer = SerialPort1.BytesToRead
    3. If ToRead > 0 Then
    4. 'Neu empfangene Zeichen an die Empfangspuffer anhängen
    5. Dim Buffer(ToRead - 1) As Byte
    6. SerialPort1.Read(Buffer, 0, ToRead)
    7. ' etwas mit Buffer() tun
    8. End If
    9. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke, aber dann hab ich ja keine Zähl variable mehr, die mir sagt wie viele Bytes im Array stehen.

    Außerdem stell ich ja so auch nicht sicher, dass mein Befehl schon fertig übertragen wird. Weil die Sub wird ja aufgerufen wenn irgendwas empfangen wird...

    Hab es jetzt so gelöst, scheint zu funktionieren. Für Verbesserungsvorschläge bin ich natürlich offen!

    VB.NET-Quellcode

    1. Dim inputData(256) As Byte
    2. Dim inputCtr As Byte = 0
    3. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    4. Do
    5. inputData(inputCtr + 1) = SerialPort1.ReadByte 'Hohle ein Byte ab und tu es in das Empfangsarray
    6. inputCtr = inputCtr + 1 'Zähle das Array eins hoch
    7. Loop Until SerialPort1.BytesToRead = 0 'Mach das so lange bis es keine Bytes mehr zu hohlen gibt
    8. End Sub


    In einer beliebigen Sub kann ich dann einfach die länge mit inputCtr prüfen und was mit inputData(xy) machen. Anschließend wird inputCtr wieder auf 0 gesetzt und ich bin wieder Empfängnisbereit ;)

    Wenn es tatsächlich mal mehr als 256 Byte werden läuft einfach inpuCtr über und er fängt vorne im Array wieder an.

    Mfg Bimbo385

    bimbo385 schrieb:

    aber dann hab ich ja keine Zähl variable mehr, die mir sagt wie viele Bytes im Array stehen.

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Dim ToRead As Integer = SerialPort1.BytesToRead
    Ohne Kommentar.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Schau dir mal mein Tut an: vb-paradise.de/allgemeines/tip…eitertes-arduino-tutorial

    Ganz unten findest du ein Beispiel welches alle Daten des ComPorts ausliest und in eine Variable speichert.


    mfg Ebrithil
    Mein Erstes Tutorial: Erweitertes Arduino Tutorial

    Simpler D&D FTP Uploader: Edge-Load