COM Port falsche Konfig?

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von AWS.

    COM Port falsche Konfig?

    Hallo zusammen...

    ich habe folgendes Problem:

    Ich muss/möchte über eine vb.net Anwendung (in VB2008, da für Win CE) eine kleine Anwendung erstellen, die verschiedene Hex Daten an ein Gerät sendet, welches über RS232 mit dem PC verbunden ist.

    Die Original Hard/Software sendet an das Gerät als erstes "11 e5" als Anfrage. .
    Wenn ich nun einen seriellen Port in VB mit richtiger Baudrate, Parity, etc. erstelle, wird laut einem Serial Port Monitor auch korrekt "11 e5" gesendet, allerdings dann im Log des Serial Monitors als irgendwelche kryptischen (oder russischen) Zeichen dargestellt (siehe Screenshots)... dies führt dazu, dass die Zielhardware nicht darauf reagiert.
    Ich kann mir das nicht erklären.
    Ich nutze den Befehl

    VB.NET-Quellcode

    1. SerialPort1.Open()
    2. SerialPort1.BaudRate = 9600
    3. SerialPort1.DataBits = 8
    4. SerialPort1.Parity = IO.Ports.Parity.Even
    5. SerialPort1.StopBits = 1
    6. Dim data() As Byte = {&H11, &HE5}
    7. SerialPort1.Write(data, 0, data.Length)


    Wenn ich diese Zeichen direkt über den Serial Monitor sende, funktioniert alles, und die Hardware reagiert.
    Zusätzlich wird bei dem Befehl "SERIAL_SET_BAUD_RATE" als chars meiner VB Form "A%.." angezeigt, und wenn ich über den Serial Monitor direkt sende, "€%..", wie ebenfalls im Screenshot ersichtlich ist, obwohl der HEX Code der gleiche ist?!
    Angehängt ist ebenfalls die eingestellte Config des Serial Ports in VB, und die des Serial Monitors, über die das senden kein Problem ist. Man merkt wahrscheinlich, das ich höchstens Grundkenntnisse in der Sache habe...aber was mache ich falsch?
    Wieso wird das nicht richtig konvertiert? Der oben angefügte Code öffnet den Port, und sendet (wie ersichtlich) den Code.
    Hat vielleicht jemand eine Idee?
    Danke im Voraus
    Bilder
    • Form_Config.PNG

      8,52 kB, 337×297, 89 mal angesehen

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

    Hallo,

    Sehe ich das richtig das du den SerialPort öffnest (.Open()) bevor du ihn initialialisierst?

    Versuche mal das .Open() als letztes aufzurufen.
    こんにちわ
    Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.
    Du hast ja lange gebraucht, Deinen ersten Beitrag zu schreiben. ;)

    AWS schrieb:

    VB.NET-Quellcode

    1. SerialPort1.Parity = IO.Ports.Parity.Even
    Nimm mal die Zeile raus, Parity ist mir bisher noch nicht untergekommen.
    Der Rest sieht gut aus, beim Senden von Bytes kann es deshalb zu "Missverständnissen" kommen, weil Deine Bytes kein Encoding kennen, der Serial Monitor aber irgend ein Encoding darüber stülpt.
    @LuaX Wenn der Serial Monitor reagiert, scheint es zu funktionieren. <X
    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 für eure Ideen...

    LuaX schrieb:

    Versuche mal das .Open() als letztes aufzurufen.


    Habe nun probeweise "SerialPort1.Open()" nach den Einstellungen gesetzt, aber natürlich vor dem Write-Befehl... hat leider nichts gebracht. Fehler wie vor.

    RodFromGermany schrieb:

    Nimm mal die Zeile raus, Parity ist mir bisher noch nicht untergekommen.

    Die Originale Software setzt Parity auf Even. Wenn ich das im Serial Monitor nicht mache, reagiert die Hardware auch darüber nicht mehr, muss also Even sein. Habe die Zeile dennoch mal entfernt, da ich das ja auch schon über die Eigenschaften von SerialPort1 festgelegt habe.
    Exakt das gleiche Fehlerbild. Anbei nochmal das Ergebnis des Logs.

    RodFromGermany schrieb:

    der Serial Monitor aber irgend ein Encoding darüber stülpt.


    Wie genau funktioniert das, und was müsste ich in VB umsetzen? :saint:
    Danke für eure Hilfe.
    Bilder
    • testneu.PNG

      7,91 kB, 1.718×86, 96 mal angesehen
    Soooo...
    ein Fehler ist (mehr oder weniger geklärt): Habe mit die Logs in Form einer HTML Datei des Serial Monitors in Opera angesehen... dieser Zeigt die komischen russischen Zeichen...Internet Explorer zeigt "^â" wie es sein soll, keine Ahnung was Opera für Probleme hat.
    Bleibt die Frage, was nun das Problem ist, auch mit System.Text.Encoding.Default (und probeweise UTF8) reagiert das Teilchen nicht... RTS und DTS enable sind beide aktiv, weil dies bei der Original Software auch der Fall ist. Ohne funktioniert aber auch nicht.
    Werde wohl versuchen rauszufinden, was der Unterschied im Log zwischen Serial Monitor bzw. Original Software, und meinem Programm ist.

    RodFromGermany schrieb:

    Parity ist mir bisher noch nicht untergekommen
    In alten Zeiten,i nsbesonders als Terminals zur Einzelzeichenübertragung verwendet wurden, war es üblich 7 Daten-Bits + 1 Parity-Bit zu senden.
    Also DataBits=7 und Parity=Odd (manchmal auch Parity=Even)
    Später wurde meist auf das Parity-Bit zugunsten eines weiteren Datenbits verzichtet, um trotzdem im 8-Bit-Bereich zu bleiben.
    Also DataBits=8 und Parity=None
    Die Übertragungssicherung wurde bei Blockübertragung dann meist über BCC oder CRC abgedeckt.

    Aber das ist natürlich reine Definitionssache und muss genau mit der Definition der Gegenstelle überein stimmen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    AWS schrieb:

    auch mit System.Text.Encoding.Default (und probeweise UTF8) reagiert das Teilchen nicht.
    Encoding ist eine Sache, die beim Senden von Strings relevant ist.
    Wenn Dy Bytes sendest, ist das Encoding egal.
    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... habe heute mal die Unterschiede geprüft, zwischen Serial Monitor und meiner VB Anwendung.
    Der Serial Monitor sendet als erstes "IOCTL_SET_WAIT_MASK" meine Anwendung macht das als vorletzten Befehl vor dem senden.

    Meine Anwendung schreib als ersetes "IOCTL_Serial_Get-Properties" (siehe Bild im Anhang), das macht der Serial Monitor (über den das senden ja funktioniert) gar nicht.
    Eine weitere Sache die mich stutzig macht.. meine Anwendung sendet "IOCTL_Serial_CLR_DTR"... und das als Client Request, also vom Gerät angefordert ?! Obwohl die Original Software DTR_enabled hat.
    Außerdem schreibt meine VB Anwendung "Set_Queue_Size", das fehlt beim Serial Monitor ebenfalls...

    Das passt ja fast schon nicht mehr hier ins Forum ^^ aber vielleicht hat trotzdem jemand eine Idee.
    Werde als nächstes schauen, ob und wie ich Set_wait_Mask als erstes senden lassen kann, und CLR_DTR sowie Get Properties und Set_Queue_Size rausschmeißen (falls möglich), damit diese Unterschiede beseitigt sind...
    Mfg
    Bilder
    • getpropertiesbeta.PNG

      25,56 kB, 1.254×326, 81 mal angesehen
    @AWS Dann bau doch genau das nach, was funktioniert.
    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!
    @AWS Das Signalspiel der Steuerleitungen kannst Du nicht beeinflusen, das ist in Hardware gegossen.
    Was an Bytes übertragen wird, kannst Du reproduzieren.
    Nach meiner Erfahrung läuft das dann.
    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!
    Komischerweise weichen die Logs zwischen VB Anwendung und Serial Monitor aber einige Unterschiede auf, bei gleicher Hardware.
    (Clear CTS habe ich in VB nie eingestellt)
    Set_Queue_size macht Serial Monitor auch nicht, VB aber schon, ebenfalls nicht von mir eingestellt. Es muss an einem dieser Unterschiede liegen, da die Bytes definitiv identisch sind zwischen Serial Monitor und meiner Anwendung.
    Bis jetzt habe ich aber keine Möglichkeit gefunden, Queue Size und Clear CTS in VB zu deaktivieren.

    AWS schrieb:

    Serial Monitor
    Ich denke mal, der macht aktiv gar nix, der lauscht einfach auf der Leitung.
    Beschreibe mal, welche aktiven Komponenten an beiden Enden der Leitung sich unterhalten bzw. es sollen, und dann dazu beide Protokolle.
    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!
    Der Serial Monitor kann auch senden, und wenn ich über den Serial Monitor die gleichen HEX Zeichen wie die Original Software sende, reagiert die angeschlossene Hardware.
    Sende ich die gleichen HEX Zeichen über meine VB Net Anwendung, mit den exakt gleichen Einstellungen (Baudrate, Parity etc.), reagiert die Hardware nicht.


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

    Definiere

    AWS schrieb:

    die gleichen HEX Zeichen
    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!
    Verwende den Serial Monitor von Eltima.
    Kann dir versichern, das es sich um meine Anwendung handelt (die aktuell nur wenige Zeilen Code hat), und habe diesen nochmal angehängt. Habe mit Get Properties, wie ersichtlich, nichts eingestellt.

    VB.NET-Quellcode

    1. SerialPort1.Open()
    2. SerialPort1.BaudRate = 9600
    3. SerialPort1.DataBits = 8
    4. SerialPort1.Parity = IO.Ports.Parity.Even
    5. SerialPort1.StopBits = 1
    6. Dim data() As Byte = {&H88, &HE2}
    7. SerialPort1.Write(data, 0, data.Length)

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

    @AWS Du sendest Bytes, nicht aber "HEX Zeichen" :!:
    Von einem "End-Of-Transmission"-Zeichen war bisher noch nicht die Rede. Gibt es so etwas?
    Was sagt das Handbuch der Hardware?
    Möglicherweise ist das ganze ein Timing-Problem, brauchen die nach jedem Zeichen eine kleine Pause?
    => System.Threading.Thread.Sleep()
    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!