Serialport.readline hängt programm auf (+Arduno)

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Dead-007.

    Serialport.readline hängt programm auf (+Arduno)

    Mein Arduino gibt ca. jede Sekunde ein signal aus. Jetzt hängt sich das Programm aber auf wenn es kein neuen Date lesen kann. Was kann ich tun?

    VB.NET-Quellcode

    1. Private Sub Timer2_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    2. If SerialPort1.ReadLine Then
    3. If Label1.Text = "END" Then
    4. Stoppp()
    5. End If
    6. Label1.Text = SerialPort1.ReadLine
    7. Timer2.Start()
    8. End If
    9. End Sub


    Danke
    Wenn Du eine Pizza bestellst, rennst Du alle 30 Sekunden zur Tür und siehst nach, ob der Bote vor der Tür steht?
    Nein.
    Du wartest, bis der Bote klingelt.
    Nutze das DataReceived-Event des SerialPorts.

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. ' was tun
    3. 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!
    Allerdings ist der nächste Fehler nicht weit :cursing:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Label1.Text = SerialPort1.ReadLine
    3. End Sub


    ich weiß das ich einen Backgroundworker verwenden müsste, bin dafür aber zu blöt ?(

    Bitte danke
    @Dead-007:
    5 Regeln für sinnvolles Fragen

    Aber ich denke, ich weiß schon, was los ist.
    Der Code wird in einem anderen Thread ausgeführt.
    Die Anforderung, den Text des Labels zu ändern, muss in den Hauptthread "rübergeschoben" werden.
    Dazu verwendet man Invoke:

    VB.NET-Quellcode

    1. Sub ...() Handles ...
    2. Me.Invoke(Sub() Label1.Text = SerialPort1.ReadLine)
    3. End Sub

    Die Invoke-Methode nimmt als Argument einen Delegat entgegen. Ein Delegat ist ein Zeiger auf eine Funktion. Wird der Delegat ausgeführt, wird die Methode ausgeführt.
    Mit dem Sub in der zweiten Zeile wird eine sogenannte Lambda-Methode erstellt und an die Invoke-Methode wird ein Delegat übergeben, der darauf zeigt.
    In der Methode steht dann ganz normaler Code. In unserem Fall wird einfach der Label-Text zugewiesen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils