Programm sendet mehrmals Daten über Serielle Schnittstelle (statt nur 1 mal)

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Programm sendet mehrmals Daten über Serielle Schnittstelle (statt nur 1 mal)

    Tach.... hab folgendes Problem:
    Ich schick mit dem Code folgende Zeichenfolge einmal je klick an meinen Arduino;

    VB.NET-Quellcode

    1. Private Sub progplus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles progplus.Click avr.Write("setm+") End Sub



    aber aus irgendnem Grund kommt am Arduino ununterbrochen die Zeichenfolge an.
    Heißt des Ding (des "setm+" soll den Modus um 1 erhöhen) zählt ununterbrochen den Modus hoch bis etwas anderes über mein Programm gesendet wird -.-


    Wenn ich übern Serial Monitor von der Arduino-Software die Zeichenfolge schick dann zählts wie gewollt nur 1mal hoch - so wies eigl sein soll. Heißt für mich dass des an dem avr.Write irgendwie liegen muss.

    Hat hier vllt jemand ne Ahnung wie ich des geregelt krieg? Oder am besten einen gehenden Code der ne Zeichenfolge NUR 1mal schickt?

    MfG Stefan
    Ohne weiteren Code wird's schwierig, das herauszufinden.
    Poste mal die Methoden, in denen auf die Schnittstelle zugegriffen wird (und erkläre bitte dazu, wo sich diese befinden).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    So....
    Im Form_Load Event:

    VB.NET-Quellcode

    1. Try
    2. avr.BaudRate = 9600 avr.PortName = Portname avr.Open() ToolStripLabel2.Text = "Connected to" Timer1.Start() Catch ex As Exception disconnected = True Application.Restart() End Try




    Dann gibts noch folgender Teil (der die Hintergrundfarbe von ner Picturebox überträgt, wenn sie sich ändert):

    VB.NET-Quellcode

    1. Private Sub color_anzeige_BackColorChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles color_anzeige.BackColorChanged
    2. Try If RadioButton1.Checked = True Then avr.Write("*") avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.R)}, 0, 1) avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.G)}, 0, 1) avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.B)}, 0, 1) avr.Write("#")
    3. ElseIf RadioButton2.Checked = True Then
    4. avr.Write("*") avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.G)}, 0, 1) avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.R)}, 0, 1) avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.B)}, 0, 1) avr.Write("#")
    5. ElseIf RadioButton3.Checked = True Then
    6. avr.Write("*") avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.G)}, 0, 1) avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.B)}, 0, 1) avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.R)}, 0, 1) avr.Write("#")
    7. ElseIf RadioButton4.Checked = True Then
    8. avr.Write("*") avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.B)}, 0, 1) avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.G)}, 0, 1) avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.R)}, 0, 1) avr.Write("#")
    9. End If
    10. Catch ex As Exception
    11. End Try
    12. End Sub




    Dann gibts noch die verschiedenen Buttons mit dem ich des Teil per PC steuern kann, z.B.:

    VB.NET-Quellcode

    1. Private Sub serial_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles serial.Click avr.Write("setm0") End Sub




    Und zu guter letzt die Schließung des Ports beim beenden:

    VB.NET-Quellcode

    1. If avr.IsOpen Then avr.Close() End If




    Also des sind jetzt alle Teile die was mit der seriellen Kommunikation was zu tun haben.
    Ich test jetzt einfach mal obs klappt wenn ich noch ne sinnlose zeichenfolge mitübertrag :D Aber des kann ja net ne dauerhafte Lösung sein ;)
    Aber Bitte VB Tags benutzen - was ist damit gemeint?
    Sonst kann man das unmöglich lesen. (Und den Code bitte erneut aus dem Visual Studio kopieren, damit die Formatierung auch wirklich stimmt.)

    Edit:
    Also von dem was ich sehe:
    Nimm überall das TryCatch raus, mit Ausnahme vom Öffnen des Ports. Und da fängst Du nicht System.Exception sondern die Ausnahme, die dabei auftreten kann (findest Du per Rechtsklick auf doe Open-Methode und dann "Gehe zu Definition").
    [VB.NET] TryCatch ist ein heißes Eisen
    Sonst findest Du Fehler nicht, sondern verschleierst sie.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    stevenart schrieb:

    Heißt für mich dass des an dem avr.Write irgendwie liegen muss.
    Was erwartet denn die Gegenstelle von Dir?
    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!
    So... meld mich mal wieder zurück :D

    Die "Gegenstelle" erwartet nen Code mit 5 Bytes (z.B. beim Setzen einer Farbe: *(anfangsbyte) R-Wert G-Wert B-Wert #(endbyte))

    Beispielsweise bei "s e t m +" sollte die Gegenstelle 1-mal hochzählen, macht sie mit dem VB-Code oben aber gleich x-mal.
    An der Programmierung von der Gegenstelle liegts nicht, denn wenn ich per Arduino-Software den obigen 5-stelligen Code schick, wird auch nur 1 mal hochgezählt.

    MfG Stefan
    Mach mal aus dem hier

    stevenart schrieb:

    VB.NET-Quellcode

    1. avr.Write("*")
    2. avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.B)}, 0, 1)
    3. avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.G)}, 0, 1)
    4. avr.Write(New Byte(0) {Convert.ToByte(color_anzeige.BackColor.R)}, 0, 1)
    5. avr.Write("#")
    eine separate Prozedur, der Du color_anzeige.BackColor übergibst. Die wird ja oft genug aufgerufen.
    Und dort schreibst Du dann rein:

    VB.NET-Quellcode

    1. Debug.WriteLine(myColor.ToArgb.ToString("X8")
    DAnn hast Du im Studio im Ausgabefenster ein Protokoll des gesendeten.
    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!

    stevenart schrieb:

    "X8" den bei der toString
    macht einen 8 Char langen Hex-String des Wertes aus der Zahl.
    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!