Conrad Relaiskarte über RS232 ansteuern

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von silu.

    Das Bytearray sollst du auch nicht in einen String konvertieren.
    Du musst die Bytes einzeln auswerten.
    Beispiel:
    Abfrage der 8 Relais-Zustände
    1 Byte = 8 Bit
    Byte(x) = 131dez = 83hex = 1000011bin
    bedeutet (von rechts nach links) Rel. 1,2 und 8 gezogen.
    Jetzt musst du die Relaiszustände abfragen.
    Für Rel. 2: If byte(x) and 2 = 2 then TXT = "Rel2 an" else TXT "Rel2 aus"

    Das letzte Byte scheint eine Prüfsummes zu sein.

    Die genaue Bedeutung steht in der Beschreibung.
    Außerdem gibt's ein Beispielprogramm für VB2008

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eierlein“ ()

    Eierlein schrieb:

    Das letzte Byte scheint eine Prüfsummes zu sein.

    Hallo Eierlein
    auch dir ein grosses Dankeschön für deine Hilfe
    ja das letzte Byte ist die Prüfsumme und besteht aus XOR von Byte0,Byte1 und Byte2

    Eierlein schrieb:

    Du musst die Bytes einzeln auswerten.Beispiel:Abfrage der 8 Relais-Zustände

    ich bin mir nicht sicher ob ich meine frage richtig formuliert habe.
    Ich will die Bytes nicht auswerten etc.
    alles was ich will ist die Bytes die mir die Karte antwortet in eine Textbox zu bringen.
    Das heisst ich will die Bytes vom Port lesen und alle Bytes die es anzeigt in der Textbox anzeigen lasen.

    silu schrieb:

    in der Textbox anzeigen lasen
    geht so:

    VB.NET-Quellcode

    1. Dim by() As Byte = {11, 22, 33, 44} ' die gelesenen Bytes
    2. Dim txt = ""
    3. For Each bb In by
    4. txt &= bb.ToString("X2")
    5. txt &= " "
    6. Next
    7. Me.Invoke(Sub() Me.TextBox1.Text = txt)
    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!

    RodFromGermany schrieb:

    silu schrieb:

    in der Textbox anzeigen lasen
    geht so:

    VB.NET-Quellcode

    1. Dim by() As Byte = {11, 22, 33, 44} ' die gelesenen Bytes
    2. Dim txt = ""
    3. For Each bb In by
    4. txt &= bb.ToString("X2")
    5. txt &= " "
    6. Next
    7. Me.Invoke(Sub() Me.TextBox1.Text = txt)


    ich danke vielmals für die grosse mühe und entschuldige mich für die fehlende hirnmasse meinerseits.. ;(
    mittlerweile bin ich wohl zu müde oder ich kapiere gar nichts mehr....hoffe ich gehe euch nicht zu fest auf die nerven..

    1.diesen code verwendet die variable by(), diese ist allerdings bereits vorhanden zum auslesen der bytes aus dem port.
    2.was soll das {11,22,33,44}?
    3.wie soll ich den befehl in dieser sub ausführen?
    4. das bb ist ja nicht deklariert wofür steht den dies?
    5. was soll das "X2"

    nochmals sorry offenbar stelle ich eure geduld gerade ein wenig auf probe jedoch ist das programmieren am serialport für mich im moment jedenfals ein grosses mysterium das sich mir noch nicht ganz offenbaren will.
    ich hoffe das sich das durch vieles nachhacken und büffeln erledigt..
    @silu
    1. Deswegen der Kommentar ' die gelesenen Bytes. Ich habe Deine Hardware nicht, ich simuliere sie.
    2. Ich weise dem Array Werte zu.
    3. VB.NET-Quellcode

      1. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
      2. Dim nb = SerialPort1.BytesToRead
      3. Dim by() = New Byte(nb) {}
      4. SerialPort1.Read(by, 0, nb)
      5. ' mit by was tun
      6. Dim txt = ""
      7. For Each bb In by
      8. txt &= bb.ToString("X2")
      9. txt &= " "
      10. Next
      11. Me.Invoke(Sub() Me.TextBox1.Text = txt)
      12. End Sub

    4. für ein Byte. Verstehe den For Each-Befehl.
    5. Probiere es aus: ToString(), ToString("n5"), ToString("X2"), ToString("X8")
    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!

    RodFromGermany schrieb:

    @sil
    1. Probiere es aus: ToString(), ToString("n5"), ToString("X2"), ToString("X8")

    1.ok so wie ich das jetzt langsam erkennen kan bekomme ich mit string("X2") alle bytes im array als hex in die textbox ist das soweit ok?
    2. nun habe ich ja alle bytes im array als hex in der textbox soweit so gut.. :D giebt es noch die möglichkeit einen leerschlag nach jedem byte einzufügen damit das ganze etwas übersichtlicher wird?
    3. da der befehl für einen leerschlag ja vbcrlf ist kan ich den gebrauchen?

    silu schrieb:

    ist das soweit ok?
    X2 - Hex mit 2 Stellen usw.

    silu schrieb:

    leerschlag

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. txt &= " "
    Probieren und verstehen.
    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!

    RodFromGermany schrieb:

    silu schrieb:

    ist das soweit ok?
    X2 - Hex mit 2 Stellen usw.

    silu schrieb:

    leerschlag

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. txt &= " "
    Probieren und verstehen.


    ahhh endlich ist der funken gesprungen und eine Zündung erfolgt.=)
    nun kan ich endlich die antwort der karte auslesen.=) juhu

    da ist noch ein phänomen das ich nicht ganz kappiere...
    das antwort frame weisst ja laut anleitung 4 bytes auf, die ersten angaben sind soweit auch ok als byte0 bekomme ich 254=i.o byte2 1=i.o byte3 11=i.o da nicht zu berücksichtingen und byte3 244=i.o(neme ich an da xor von 0,1,2)
    1. allerdings lese ich mehr als 4 bytes vom port..was ist da los?

    silu schrieb:

    was ist da los?
    Da musst Du eine Hardware oder deren Hersteller befragen.
    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!
    Soo da nun einige probleme gelöst sind und ich nun dank der Antwort der Karte sehen kann das diese auch ordentlich initialisiert wurde geht es nun an das nächste problem.
    die for each funktion habe ich ebenfalls benutzt um zu sehen was ich der Karte überhaupt sende.
    Nun erkenne ich das ich zwar die Initialisierung sende danach aber beim klick auf einen Button kein weiteres Frame an die karte sende.
    zum senden der Frames an die Karte benutze ich eine Public Function.

    VB.NET-Quellcode

    1. Public Function Senden(ByVal cmd, ByVal adr, ByVal data) As Byte
    2. Dim buffer(3) As Byte
    3. Dim send = ""
    4. buffer(0) = cmd
    5. buffer(1) = adr
    6. buffer(2) = data
    7. buffer(3) = cmd Xor adr Xor data
    8. SerialPort1.Write(buffer, 0, 4)
    9. For Each bb In buffer
    10. send &= bb.ToString("N")
    11. send &= (" - ")
    12. Next
    13. txbsend.Text = send
    14. End Function​


    als Warnung bekomme ich das die senden Funktion nicht an alle Codepfaden einen wert zurückgibt.
    1. Aus dieser Warnung schlussfolgere ich das ich der Funktion einen Returnanweisung anfügen muss ist das korrekt?
    hierbei entstehen wieder einige Probleme.
    die Erklärung von msdn ist hierbei für mich etwas irreführend..
    http://msdn.microsoft.com/de-de/library/sect4ck6.aspx

    2.meine Überlegung war die returnanweisung auf den buffer(3) zu setzen wäre das intelligent?
    3.auch eine Möglichkeit wäre ein boolean einzufügen und sobald in der txbsend ein text drin ist auf true zu setzen, danach würde ich die return dem boolean zuweisen. wäre das auch eine Möglichkeit?
    4.wäre es sogar sinnvoll anhand meines codes eine exit function anweisung einzufügen?
    Auszug aus dem Beispielprogramm:

    VB.NET-Quellcode

    1. ...
    2. ...
    3. Send_buffer(0) = Command_Byte 'Übernahme des Kommandrahmens in den Sendebuffer
    4. Send_buffer(1) = Address_byte
    5. Send_buffer(2) = Data_byte
    6. Send_buffer(3) = Command_Byte Xor Address_byte Xor Data_byte 'Berechnung der Prüfsumme
    7. TextBox.Text = ("CMD: " & Command_Byte.ToString & ", Adr: " & Address_byte.ToString & ", Data_byte: " & Data_byte.ToString & ", CRC: " & Send_buffer(3).ToString)
    8. SerialPort1.Write(Send_buffer, 0, 4)
    9. sleep(Kartenzahl * 8 + 10) ' Zeit zur Ausführung des Kommandorahmens
    10. SerialPort1.DiscardOutBuffer()
    11. SerialPort1.DiscardInBuffer()
    12. GetSchaltzustände:
    13. Send_buffer(0) = 2 ' Get Ports
    14. Send_buffer(1) = 0 ' Broadcast
    15. Send_buffer(2) = 0
    16. Send_buffer(3) = Send_buffer(0) Xor Send_buffer(1) Xor Send_buffer(2)
    17. SerialPort1.Write(Send_buffer, 0, 4)
    18. sleep(Kartenzahl * 8 + 10) ' Wartezeit for Antworten
    19. SerialPort1.DiscardOutBuffer()
    20. For x As Byte = 0 To Kartenzahl - 1
    21. SerialPort1.Read(In_buffer, 0, 4)
    22. Schaltzustands_Backup(x) = In_buffer(2)
    23. BINARYSTRING = Convert.ToString(In_buffer(2), 2)
    24. BINARYSTRING = BINARYSTRING.PadLeft(8, "0"c)
    25. State_List.Items.Add((x + 1).ToString & ": " & vbTab & "Dez.: " & In_buffer(2).ToString & vbTab & vbTab & "Bin.:" & BINARYSTRING)
    26. Next
    27. ...
    28. ...

    silu schrieb:

    nicht an alle Codepfaden einen wert zurückgibt.
    Eine Funktion erwartet einen Rückgabewert. Da Du nix zurückgeben musst, mach da eine Sub draus.
    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!

    RodFromGermany schrieb:

    silu schrieb:

    nicht an alle Codepfaden einen wert zurückgibt.
    Eine Funktion erwartet einen Rückgabewert. Da Du nix zurückgeben musst, mach da eine Sub draus.


    Soooo vielen vielen dank..=)
    aus der Function wurde eine sub gemacht und auch der Fehler wiso das beim Clickereignis auf einen button den befehl nicht an die karte gesendet wurde habe ich gefunden.=)
    Mittlerweille funktioniert das meisste so wie es sollte.