Cypress Enable - 0x00 an API Funktion

  • Sonstige

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von human.

    Cypress Enable - 0x00 an API Funktion

    Moin

    Ich möchte einen String an eine dll Funktion übergeben, welcher auch Hex 0 enthalten muss.
    Ich benutze als Skipter Cypress Enable (ähnlich VB6 oder VBA).
    Leider werden alle Hex 0 bei Ausgabe entfernt oder Verschluckt oder sonst was.

    Beispiel:

    Visual Basic-Quellcode

    1. 'Cypress Enable Code
    2. a = Chr(0) & Chr(1) & Chr(0) 'Ergebnis ist Hex 01 statt Hex 00 01 00
    3. b = Len(a) 'Ergebnis ist Eins statt Drei
    4. Print a 'Ergebnis SOH (na ja, man sieht hat nichts) Statt NUL SOH NUL


    Ich habe schon viele Möglichkeiten probiert (a = Null oder mit einer Array, VbNullChar hab ich leider nicht),
    das ich momentan nach einer Lösung "an Cypress vorbei" suche.

    Ach ja, mit VBA funktioniert die Übergabe problemlos.

    Wie wäre es mit einer Klassenbibliothek, der ich einen Hex-String übergebe, die Klasse konvertiert diesen in Zeichen und
    gibt das Ergebnis wieder an Cypress oder weiter an die API.

    Zwei Probleme könnten sich dabei jedoch ergeben:
    1. Cypress schneidet bei Rückgabe wieder die Hex Nullen ab,
    2. bei Weitergabe durch die Klasse an die API, bin ich mir nicht sicher, ob das überhaupt funktioniert, weil die String-Übergabe mit Cypress normalerweise über eine Klasse/Objekt!? erfolgt.

    Da ich mit VB.Net noch gar keine Erfahrung habe, bin ich auch gleich diesem - einfach klingendem - Tutorial gefolgt, welches erfolgreich schief lief!

    ... denn diesen Code mochte Visual Studio irgendwie nicht:

    Visual Basic-Quellcode

    1. Namespace MeineDll
    2. Public Class SendHexString
    3. Function getHexString(ByVal hStr As String) As String
    4. Dim h1 As String, h2 As String
    5. Dim dez As Integer
    6. Dim i As Long
    7. h1 = hStr
    8. For i = 1 To Len(h1) Step 2
    9. dez = Val("&H" & Mid(h1, i, 2))
    10. h2 = h2 & Chr(dez)
    11. Next
    12. Return h2
    13. End Function
    14. End Class
    15. End Namespace


    Ich dachte das Len, Mid, Var auch in VB.Net funktionieren.
    Die Syntax Beschreibung zum Erstellen einer Klassenbibliothek konnte ich auf die schnelle nicht finden.

    Ich würde mich freuen, wenn mich jemand begleiten würde, bis ich dieses Problem gelöst habe.

    Gruß
    Robert

    human schrieb:

    Leider werden alle Hex 0 bei Ausgabe entfernt oder Verschluckt oder sonst was.
    Wer verschluckt die?
    Geht bei Dir der String nach der 0 weiter?
    Kann es sein, dass das nur ein Anzeigeproblem ist?
    in der Programmiersprache C / C++ (nicht aber C#) ist das Zeichen 0 die Kennung dafür, dass der String zu Ende ist.
    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:

    Wer verschluckt die?

    Cypress Enable, vielleicht auch Windows. Ich weiß es leider nicht.

    RodFromGermany schrieb:

    Kann es sein, dass das nur ein Anzeigeproblem ist?

    Ich glaub nicht.
    Hier die Ausgabe von VBA und Cypress Enable zwischen den |
    hier mit Notepad++,
    ... und in Hex.

    Es sei denn, das das schreiben in eine Datei und das übergeben eines Strings, sich Speichertechnisch anders verhält.

    RodFromGermany schrieb:

    in der Programmiersprache C / C++ (nicht aber C#) ist das Zeichen 0 die Kennung dafür, dass der String zu Ende ist.

    Das hab ich vor kurzem auch gelesen.
    Aber warum wird Hex 06 01 05 20 01 FF trotzdem verarbeitet, obwohl vorher noch Nullen sind?
    Bilder
    • Hex.png

      2,94 kB, 1.138×51, 164 mal angesehen
    • HexNotepad++.png

      1,7 kB, 306×55, 165 mal angesehen
    Dateien
    • Hex out2.txt

      (31 Byte, 185 mal heruntergeladen, zuletzt: )

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

    human schrieb:

    Aber warum
    Keine Ahnung, ich kenne VBA und Cypress Enable nicht.
    Erwarten die Prozeduren, die Du aufrufst, 0-Zeichen im Text?
    Was sagt die Beschreibung dieser Prozeduren und deren Parameter?
    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!
    Die Beschreibung der Prozeduren ist dürftig.
    Hier.
    object.SendData(s As String) As Long
    Send data to remote host

    RodFromGermany schrieb:

    Erwarten die Prozeduren, die Du aufrufst, 0-Zeichen im Text?

    In diesem Beispiel (in Höhe Ende 1/3 der Seite):
    MbusQuery = Chr(0) + Chr(0) + Chr(0) + Chr(0) + Chr(0) + Chr(6) + Chr(0) + Chr(3) + Chr(0) + Chr(0) + Chr(0) + Chr(20)
    ... werden nur Chars übergeben, also ja.


    Dieses VB.Net Beispiel
    sieht das schon anders aus:

    VB.NET-Quellcode

    1. Private Sub wsTCP_OnConnect() Handles wsTCP.OnConnect
    2. wsTCP.SendData("GET /" & sPage & " HTTP/1.0" & vbCrLf & vbCrLf)
    3. End Sub


    Gleich zweimal vbCrLf ???
    Also zweimal Chr$(13) & Chr$(10) ?
    Dateien
    • frmMain.frm

      (5 kB, 135 mal heruntergeladen, zuletzt: )
    @human Funktioniert das ganze unter VBA für Excel, wie in dem Link?
    Gleich zweimal vbCrLf
    Das sind offensichtlich Steuerzeichen für iwas.
    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!
    Moin

    RodFromGermany schrieb:

    Funktioniert das ganze unter VBA für Excel, wie in dem Link?

    Du meins den Link von https://accautomation.ca ?
    Mit VBA Ja, mit Cypress nicht - wegen der fehlenden 0x00.

    Ich habe Gestern mit Wireshark die Kommunikation gesnifft und die gesendeten Strings mit VBA und Cypress sind dieselben wie aus Post 3.

    Das Problem ist meiner Meinung nach definitiv Cypress.

    Allerdings bin ich durch das VB.Net Beispiel aus der frmMain.frm auf die Idee gekommen,
    die Kommunikation statt mit dem Modbus Protokoll über HTTP Protokoll zu tätigen.
    Da hier offensichtlich Klartext Html Code übergeben wird.
    Mit Wireshark konnte ich das Ergebnis diesen Codes

    VB.NET-Quellcode

    1. Private Sub wsTCP_OnConnect() Handles wsTCP.OnConnect
    2. wsTCP.SendData("GET /" & sPage & " HTTP/1.0" & vbCrLf & vbCrLf)
    3. End Sub

    ... auch sehen.

    Ich weiß nur noch nicht so ganz, was ich in HTTP alles übergeben muss.

    gruß
    Robert