RS232 daten empfangsproblem

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Killerawft.

    RS232 daten empfangsproblem

    Hallo.

    Ich bin gerade dabei eine Kommunikation zwischen PC und Mikrocontroller aufzubauen, um den Mikrocontroller zu steuern. Mit dem Mikrocontroller ahbe ich keine Probleme mit dem Empfang und senden von Daten, jedoch habe ich bei dem Visual basic Programm Probleme.

    Ich will dem µC verschiedene Datenpakete hintereinander senden. Da der µC zum verarbeiten eine gewisse zeit brauch, und in der Zeit nicht zum Empfangen bereit steht, soll das PC programm das erste byte los schicken, und mit dem zweiten warten, bis der µC wieder antwortet und somit für das nächste bereit ist. Das funktioniert auch, jedoch nur mit einem Hacken. ich muss jedes mal, wenn das PC Programm auf den µC wartet, also etwas empfagen soll, eine msgbox einfügen, bei der man ok anklicken muss. Das heisst mein PC programm kann, wenn es in einer Do loop auf den Empfang vom µC wartet nicht auf ein _DataReceived event reagieren.
    Wenn ich dann jedes mal eine msgbox einfüge, klappt das Programm wunderabr.

    Weiß jemand woran das liegt und wie ich das beseitigen kann?
    Msgboxen halten das Programm solange an, bis sie geschlossen werden. Entweder eine eigene "MsgBox" mittels Form erstellen oder besser noch das Programm auf dem Mikrocontroller überarbeiten. Falls wirklich so umfangreiche Daten nötig sind, gibt es Handshaking. Dieses wurde genau für solche Zwecke erfunden.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Nutzt Du die Klasse SerialPort von .NET?
    Da hast Du ein Ereignis DataReceived, in dem Du auch senden kannst, wenn die empfangenen Zeichen Dich dazu auffordern.
    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!
    Also wenn ich ein Handshake benutzen will, müsste ich nochmal an meiner Schaltung rumlöten, was ich eigentlich vermeiden will.

    Ich denke ich hab das Problem auch schon gelößt. Da war denke ich ein Konflikt mit den empfangenen daten als string und weiterverarbeitung als normale zahl.
    Also das Problem ist nicht der Handshake oder so. Mein problem ist, dass ich während des Ausführen des unteren Codes nicht in die _datareviced sub springen kann. Nur wenn ich die msgboxen aktiviere und ich habe keine Ahnung warum. Sonst klappt das empfangen von Daten ganz gut.



    Quellcode

    1. 'Alle LED's ausgewählt
    2. If RadioButton2.Checked Then
    3. Dim Farbe As String() = ColorEdit18.Text.Split(";")
    4. SerialPort1.Write("002" & vbLf)
    5. Form2.MemoEdit1.Text = Form2.MemoEdit1.Text & "002" & vbNewLine
    6. 'MsgBox("Erstes Byte gesendet")
    7. Application.DoEvents()
    8. Do
    9. If empfangendbl = 1 And gesendet = 0 Then
    10. gesendet = 1
    11. SerialPort1.Write(Format(CSng(Farbe(0)), "00#") & vbLf)
    12. Form2.MemoEdit1.Text = Form2.MemoEdit1.Text & Format(CSng(Farbe(0)), "00#") & vbNewLine
    13. 'MsgBox("Zweites Byte gesendet")
    14. Application.DoEvents()
    15. End If
    16. If empfangendbl = 2 And gesendet = 0 Then
    17. SerialPort1.Write(Format(CSng(Farbe(1)), "00#") & vbLf)
    18. Form2.MemoEdit1.Text = Form2.MemoEdit1.Text & Format(CSng(Farbe(1)), "00#") & vbNewLine
    19. 'MsgBox("Drittes Byte gesendet")
    20. Application.DoEvents()
    21. gesendet = 1
    22. End If
    23. If empfangendbl = 3 And gesendet = 0 Then
    24. SerialPort1.Write(Format(CSng(Farbe(2)), "00#") & vbLf)
    25. Form2.MemoEdit1.Text = Form2.MemoEdit1.Text & Format(CSng(Farbe(2)), "00#") & vbNewLine
    26. 'MsgBox("Viertes Byte gesendet")
    27. Application.DoEvents()
    28. gesendet = 1
    29. End If
    30. gesendet = 0
    31. Loop Until empfangendbl = 4 And gesendet = 0
    32. ' MemoEdit1.Text = "Rotanteil: " & Format(CSng(Farbe(0)), "00#") & vbNewLine & "Grünanteil: " & Format(CSng(Farbe(1)), "00#") & vbNewLine & "Blauanteil: " & Format(CSng(Farbe(2)), "00#")
    33. End If
    Möglicherweise hängt es ja an deiner Do Loop Schleife.
    Wozu brauchst du die eigentlich?
    Dafür hat man doch datareceived, damit das asynchron geht.


    Und deine Applicaton.DoEvents werden nur ausgelöst
    wenn die If Bedingungen zutreffen.

    Ich müsste mich aber erst tiefer in den Code rein lesen...

    Ich denke normalerweise wird man irgend etwas über den Port schicken.
    Die Gegenseite antwortet irgend wann. Dadurch wird das DataReceived-Ereignis
    ausgelöst. Nun bist du dran, das was da empfangen wurde, zu analysieren.
    Möglicherweise bekommst du schon dein Empfangs-Ereignis, sobald das erste
    Byte angekommen ist. Damit wirst du aber vielleicht noch nichts anfangen können.
    Also wirst du deine empfangenen Bytes erst mal zusammen setzen müssen, bis
    du meinetwegen ein CR/LF erhalten hast. Nun kannst du die Zeile in einen Parser
    geben, der analysiert, um welche Art von Daten es sich handelt und daraufhin
    irgend welche Anzeigen im Programm macht.
    Erst jetzt solltest du deine neue Anfrage über den Port schicken.
    Für all das brauchst du nicht in einer Schleife zu warten, oder DoEvents zu
    verwenden.
    So hatte ich es zumindest mal gelöst, als ich ein Steuerprogramm für
    ein Radiogerät geschrieben hatte.
    Das DataReceived-Ereignis sollte dein Programm triggern.

    Und falls kontinuierlich Daten kommen, musst du dir halt einen Puffer anlegen,
    den du meintewegen durch einen Timer oder Thread immer mal wieder leerst.

    Überdenke doch noch mal dein Konzept.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Lightsource“ ()

    Killerawft schrieb:

    Mit dem Mikrocontroller ahbe ich keine Probleme mit dem Empfang und senden von Daten, jedoch habe ich bei dem Visual basic Programm Probleme.



    Wenn deine AVR Empfangs Routine Int gesteuert ist , kannst du sauber Pakete empfangen.
    Zusätzlich kannst du die zu sendenden Pakete mit Konstanter Länge senden und dann als richtig oder falsch quittieren.
    Dies ist nicht sehr professionell,aber einfach.
    Die Quittierung im Receiver Event durch führen.

    Sendest du nur ASCII Pakete kannst du auch mit Start und Ende Byte arbeiten.

    ..es gibt noch mehr Möglichkeiten.

    MfG
    Also ich hatte kein Problem mit dem senden oder Empfangen mit dem PC sonder mit dem Basic Programm.

    Ich hab das Problem hier wohl nicht verständlich genug erklärt und ihr konntet mir nicht wircklich weiterhelfen, aber ich hab mein Problem inzwischen selbst gelößt.

    Trotzdem habt ihr hier interessante Infos für spätere Projekte gepostet.

    Danke für eure Mühe!