hex-string an serielle schnitstelle

  • VB6

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

    hex-string an serielle schnitstelle

    hallo geschätzte vb-gemeinde,

    ich komme nicht weiter....

    ich bin in schen vb-sehr unerfahren aber ich habe schon einiges geschafft was ich mir in den kopf gesetzt habe aber jetzt komme ich nicht mehr weiter.

    ich steuer über excel einige sachen im haus was sehr gut und verlässlich läuft.

    ich sende einen seriellen string an die rs232 und der controller führt den schaltbefehl aus. jetzt möchte ich gerne ein modul ansprechen aber die steuerbefehle sind hex strings und da weiß ich nicht wie ich damit umgehe.

    hier mein bestehendes programm wo ich mit einen button zb. ein relais ansteuer.

    'Attribute VB_Name = "Schalten"'
    Declare Sub OPENCOM Lib "RSAPI.DLL" (ByVal Parameter As String)
    Declare Sub CLOSECOM Lib "RSAPI.DLL" ()
    Declare Sub SENDSTRING Lib "RSAPI.DLL" (ByVal s As String)

    Sub MAIN()
    OPENCOM "COM1:9600,N,8,1"
    SENDSTRING "W 026 1" +Chr$(13)
    CLOSECOM

    jetzt möchte ich gerne über einen weiteren button diesen hex-string senden 7E FF 06 0D 00 00 00 EF
    kann mir hier bitte wer weiterhelfen?

    vorerst vielen lieben dank und schöne grüße
    @logo_flo Willkommen im Forum. :thumbup:
    Auch wenn ich von VB6 jetzt nicht die ganz große Ahnung habe, sollten wir doch die Herangehensweise von @Eierlein so präzisieren, dass Du das ganze verallgemeinern kannst.
    Zunächst ist die Hex-Darstellung lediglich eine String-Repräsentation eines Zeichens / Bytes. Da gibt es z.B. noch die Dezimal-, die Oktal- und die Binärdarstellung. Das ist eine reine Formatierungssache (da kann ich Dir wegen der VB6-Syntax nicht wirklich helfen).
    Nun gibt es folgende Möglichkeiten:
    Du sendest einen String, der in eine Byte-Folge zu konvertieren ist
    oder
    Du sendest direkt eine Byte-Folge.
    Zu klären ist noch, in welcher Syntax Dein Empfänger die Zeichen empfangen will, also welceh Zeichen zwischen den Hex-Zeichen stehen und mit welchem Zeichen ein Befehl beginnt und abgeschlossen werden muss.
    Mach Dir also eine Prozedur, der Du Deinen Sende-String übergibst. Diesen Sende-String konvertierst Du in Bytes und diese ins Hex-Format, setzt sie zu einem kompletten Befehl zusammen und sendest diesen über die RS232 an die Gegenstelle. Feddich.
    =====
    Vielleicht solltest Du überlegen, sofort auf VB.NET umzusteigen, da wird insbesondere das Bedienen der seriellen Schnittstelle fast zu einem Kinderspiel. ;)
    Bytes haben einen Wertebeereich von 0 bis 255, da musst Du lediglich eine geeignete Format-Anweisung bemühen.
    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 euch zwei für eure hilfe!


    wie mein empfänger die zeichen empfangen will ist mir eigentlich unklar.
    klar ist mir nur, dass ich ein terminalprogramm habe wo ich sagen kann: "send string as hex"
    wen ich im terminalprogramm den hex string 7E FF 06 0F 00 01 01 EF zb. sende macht der empfänger das was ich will....

    ich habe jetzt den vorschlag von Eierlein versucht:

    'Attribute VB_Name = "Schalten"'
    Declare Sub OPENCOM Lib "RSAPI.DLL" (ByVal Parameter As String)
    Declare Sub CLOSECOM Lib "RSAPI.DLL" ()
    Declare Sub SENDSTRING Lib "RSAPI.DLL" (ByVal s As String)

    Sub MAIN()

    OPENCOM "COM2:9600,N,8,1"
    SENDSTRING "chr$(&h7E) & chr$(&hFF) & chr$(6) & chr$(&h0F) & chr$(0) & chr$(1) & chr$(1) & chr$(&hEF)"
    CLOSECOM

    End Sub


    auch zum schluss mit einen "CR" +Chr$(13) aber es funktionierte leider nicht.

    vorerst vielen,vielen dank für die unterstützung!

    logo_flo schrieb:

    SENDSTRING "chr$(&h7E) & chr$(&hFF) & chr$(6) & chr$(&h0F) & chr$(0) & chr$(1) & chr$(1) & chr$(&hEF)"
    Da hast Du aber den Code von @Eierlein völlig falsch abgeschrieben.
    Lass mal die einschließenden Apostrophen weg:

    Eierlein schrieb:

    Visual Basic-Quellcode

    1. SENDSTRING chr$(&h7E) & chr$(&hFF) & chr$(6) & chr$(&h0D) & chr$(0) 6 chr$(0) &chr$(0) & chr$(&hEF)
    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!
    hallo,
    ja ich habe mit einen anderen string auch noch etwas probiert......
    beim string von Eierlein steht eine 6 sollte das nicht ein & sein? & chr$(0) 6 chr$(0)
    wenn ich den code von eierlein nehme kommt ein syntaxfehler fehler beim kompilieren. mache ich die apostrophen, kommt keine fehlermeldung.....
    @logo_flo Eierlein hat Dir den Sende-String aus den einzelnen Zeichen zusammengebaut.
    Kann sein, dass er die Leerzeichen zwischen den Zeichen vergessen hat. Das müsstest Du noch überprüfen.
    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, jetzt weiß ich zumindest wo der fehler liegt
    ich habe mir jetzt angeschaut was wirklich aus der rs232 kommt.

    sende ich diesen string:
    SENDSTRING Chr$(&H7E) & Chr$(&HFF) & Chr$(6) & Chr$(&HD) & Chr$(0) & Chr$(0) & Chr$(0) & Chr$(&HEF)
    kommt dies hier raus:
    7E FF 06 0D


    sende ich diesen string:
    SENDSTRING Chr$(&H7E) & Chr$(&HFF) & Chr$(6) & Chr$(&HD) & Chr$(1) & Chr$(1) & Chr$(1) & Chr$(&HEF)
    kommt dies hier raus:
    7E FF 06 0D 01 01 01 EF

    es werden die 00 nicht ausgegeben & Chr$(0) sende ich aber & Chr$(1) kommt 01 herraus und der string ist vollständig.

    was ist da falsch.....

    logo_flo schrieb:

    es werden die 00 nicht ausgegeben
    Probier mal, den String direkt auszugeben:

    Visual Basic-Quellcode

    1. SendString "7E FF 06 0D 00 00 00 EF"
    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!

    logo_flo schrieb:

    das geht leider auch nicht.
    Das ist mir völlig unklar.
    Kannst Du zum Test ein simples VB.NET-Programm schreiben?
    Form mit Button und SerialPort:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Me.SerialPort1.PortName = "COM2" ' Deins natürlich
    3. Me.SerialPort1.BaudRate = 9600
    4. ' weitere Initialisierungen
    5. Me.SerialPort1.Encoding = System.Text.Encoding.ASCII ' oder .UTF8
    6. Me.SerialPort1.Open()
    7. Me.SerialPort1.Write("7E FF 06 0D 00 00 00 EF")
    8. Me.SerialPort1.Close()
    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!