RS232 / serielle Schnittstelle unter WIN7 (64bit)

  • Hallo zusammen,

    nachdem ich von WIN XP auf WIN 7 umgestiegen bin schaffe ich es nicht mehr über die (virtuelle) serielle Schnittstelle Daten zu übertragen bzw. zu empfangen.
    Der Treiber stellt eine RS232-Schnittstelle über USB zur Verfügung. Der Treiber funktioniert, das Config-Tool zum Gerät funktioniert (Daten können gelesen und geschrieben werden).

    Ich will unter WIN 7 (64bit) einem String z.B. „GO“ oder „STOP“ senden und dann einen (oder mehrere) Antwort-String(s) z.B. „GO“ empfangen. Jeder Sende- bzw. Empfangszeile ist mit CHR(13) abgeschlossen
    Mit WIN XP habe ich es über ObjCreate("MSCOMMLib.MsComm.1") recht gut hinbekommen.

    Da die verwendete MSCOMM32.OCX bei einigen Rechnern angeblich nicht registriert ist, soll man das Problem so beheben können (nie selber ausprobiert, ging immer ohne!):
    Finde den Link leider nicht mehr, deswegen das Codefragment

    [autoit][/autoit][autoit][/autoit][autoit]

    $MsComm1 = ObjCreate("MSCOMMLib.MsComm.1") ; überprüfung ob sich objekt com generieren lässt
    if not IsObj($MsComm1) then ; wenn nicht dann
    MsgBox(0,"Fehler"," Kann datei : mscomm32.ocx : nicht im system finden. Installation läuft")
    FileInstall("MSCOMM32.OCX", EnvGet("SystemRoot") & "\System32\MSCOMM32.OCX") ; installation der mscomm32.ocx
    Run(@ComSpec & " /c C:\WINDOWS\SYSTEM32\REGSVR32.EXE C:\WINDOWS\SYSTEM32\MSCOMM32.OCX") ; ausführung
    RegWrite("HKEY_CLASSES_ROOT\Licenses\DB4C0D00-400B-101B-A3C9-08002B2F49FB", "", "REG_SZ", "mgkgtgnnmnmninigthkgogggvmkhinjggnvm") ; registration
    RegWrite("HKEY_CLASSES_ROOT\Licenses\7BC20EDC-4A42-101B-A3C9-08002B2F49FB", "", "REG_SZ", "gifblihbhiiihbciocfbkifbqcfcdiebbiqh") ; registration
    $MsComm1 = ObjCreate("MSCOMMLib.MsComm.1") ; erneute überprüfung ob sich objekt com generieren lässt
    endif

    [/autoit]

    Entsprechen habe ich die Datei in WIN 7gesucht, gefunden und leider die Registrierung nicht hinbekommen (Pfade natürlich angepasst). Muss auch gestehen, dass ich keine Ahnung haben was da genau abläuft... ?(
    Plan B war dann mal zu schauen was es sonst schon gibt.

    Bin auf [ gelöst ] COM Objekt für RS232 Kommunikation und die UDF vom User veronesi gestoßen.
    Bei Verwendung der UDF kann ich ohne Error öffnen, schreiben und schließen, nur wird offensichtlich nichts geschrieben. Der Empfänger reagiert nicht... ;(

    Jetzt bin ich auf der Suche nach Plan C oder der Lösung der Problem bei Plan A und B.

    Habe übrigens bisher „nur“ nach „RS232“, „COMPORT“, „serieller Schnittstelle“ gesucht.
    Habe ich vielleicht nicht das richtige Stichwort getroffen?

    Schon mal vielen Dank für die Hilfe
    Ralf

    Einmal editiert, zuletzt von Eisenbahn_Ralf (9. August 2011 um 13:11) aus folgendem Grund: Status auf gelöst gesetzt

  • Hallo Max,

    Danke für den Willkommensgruß.

    Deinen Link hatte ich irgend wann auch schon mal gesenen und es schon mal aufgegeben...
    Habe es jetzt aber noch mal Probiert, leider nur mit einem Teilerfolg, hier das Ergebnis:

    Zum Testen senden ich:
    "GO" : das Gerät sendet "Pwr on" zurück und zeigt im einem Display den Status an
    "STOP" : das Gerät sendet "Pwr off" zurück und zeigt im Dispaly "STOP" an

    Mit dem Beispiel vom martin schaffe ich es mit dem "GO" das Gerät "einzuschalten" :party:
    Ich bekomme aber keine Rückmendung (das "Pwr on"), habe bisher noch nie irgend was lesen können, auch schon mal andere Befehle probiert...
    Seltsam ist auch das ich "GO@CR" eingeben muss, nur "GO" bringt nichts, obwohl in Bsp in der Sendefunktion das @CR drangehangen wird ?(

    Wenn ich "STOP" sende springt die Displayanzeige kurz auf "Stop" und dann wieder auf den Anzeige bei "GO".
    Also wird irgend was gesendet, schon mal klasse!
    Hier reicht übrigens die Eingabe "STOP", also ohne zusätzliches @CR ?( ?(

    Da das Beispiel etwas lang ist habe ich mal die wesentichen Funktionen in einem kurzem Programm zusammengefasst.
    Hier geht geht nicht mal der "GO"-Befehl, ganz zu schweigen vom Empfangen ?( ?( ?(

    Spoiler anzeigen
    [autoit]


    #include <CommMG.au3>
    ConsoleWrite("CommPortConnection: "& _CommPortConnection() & @CR) ; nur zur Kontrolle, muss "0" liefern

    [/autoit] [autoit][/autoit] [autoit]

    _CommSetXonXoffProperties(11,13,100,100) ; aus CommgExample übernommen
    _CommSetTimeouts(5,5,5,5,5) ; aus CommgExample übernommen

    [/autoit] [autoit][/autoit] [autoit]

    DIM $Error_1
    ; _CommSetPort($iPort, ByRef $sErr, $iBaud = 9600, $iBits = 8, $iPar = 0, $iStop = 1, $iFlow = 0, $RTSMode = 0, $DTRMode = 0)
    $Error_2 = _CommSetPort(3, $Error_1,9600,8,0,1,2,0,0)
    ; i.O.: $Error_2 = 1 / $Error_1 = leer / @error = 0
    ;n.i.O. $Error_2 = 0 / $Error_1 = irgend was / @error > 0
    ConsoleWrite("SetPort: E1: " & $Error_1 & " E2: "&$Error_2 &" ERROR: " & @error & @CR)
    ;Ausgabe -> SetPort: E1: E2: 1 ERROR: 0 , scheint i.O zu sein

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite("CommPortConnection: "& _CommPortConnection() & @CR)
    ; -> muss jetzt "COM3" liefern, tut es auch, also auch i.O.

    [/autoit] [autoit][/autoit] [autoit]

    $send = _CommSendstring("GO"&Chr(13)) ; $send immer "1"
    ConsoleWrite("Senden: " & $send & " Error: "& @error & @CR)
    ; -> muss Senden: 1 Error: 0 liefern, tut es auch, also auch i.O.

    [/autoit] [autoit][/autoit] [autoit]

    ;$getLine = _CommGetLine(@CR, 100, 1000)
    ;ConsoleWrite("GetLine: " & $getLine & " Error: "& @error & @CR)

    [/autoit] [autoit][/autoit] [autoit]

    $getstring = _Commgetstring()
    ConsoleWrite("Empfangen?: " & $getstring & " Error: "& @error & @CR)
    ; muss bei "GO" wird "Pwr on" zurück gesendet
    ; Ausgabe: Empfangen?: Error: 0 , also nicht empfangen

    [/autoit] [autoit][/autoit] [autoit]

    _CommClosePort()

    [/autoit]


    Irgend eine Idee?

  • Hallo zusammen,

    die Idee es mit der UDF aus http://www.autoitscript.com/forum/topic/12…t-com-port-udf/ zu versuchen war gut, aber ich hätte alle Beiträge gleich lesen sollen.
    Die verwendetet commg.dll soll leider "nur" für WIN7 / 32bit sein (s. Posted 30 July 2011).

    Bin für jeden neue Idee oder Tipp dankbar, die serielle Schnittstelle irgend wie unter WIN7/64bit zum laufen zu bringen.

    Ralf

  • Hallo funkey,

    wie geht das?

    Muss mich hier als Anfänger outen, sorry, hoffe die Frage ich nicht zu blöd.

    Ralf

  • Hallo zusammen,

    Problem verschwunden...

    1. Autoit mit "aktueller" Version noch mal installiert (wird nix gebracht haben)
    2. Test-Programm neu geschrieben, um die Eingaben etwas zu erleichtern (Inhalt sollte gleich sein)
    3. Wartezeit zwischen senden und lesen eingebaut <- das scheint DIE EIGENTLICHE LÖSUNG zu sein, nicht ganz so schnell sein!

    Hier das Ergebins (nicht schön, Funktioniert aber):

    Spoiler anzeigen
    [autoit]


    #cs
    Test vom CommMG.au3 Version 2.84 mit Commg.dll
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <CommMG.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)
    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    DIM $p_end=0
    DIM $Error_1, $Error_2, $send, $getstring, $getline
    DIM $MainWindow, $B_XGO, $B_XSTOP, $B_OPEN, $B_CLOSE, $I_SEND, $E_Transmit, $B_SEND
    DIM $output=""

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $MainWindow = GUICreate ("Test CommMg", 300,300)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSE")
    $B_OPEN = GUICtrlCreateButton("OPEN", 10, 10, 100)
    GUICtrlSetOnEvent($B_OPEN, "OPEN")
    $B_CLOSE = GUICtrlCreateButton("CLOSE", 120, 10, 100)
    GUICtrlSetOnEvent($B_CLOSE, "CLOSE")
    $B_XGO = GUICtrlCreateButton("XGO", 10, 50, 100)
    GUICtrlSetOnEvent($B_XGO, "XGO")
    $B_XSTOP = GUICtrlCreateButton("XSTOP", 120, 50, 100)
    GUICtrlSetOnEvent($B_XSTOP, "XSTOP")
    $I_SEND = GUICtrlCreateInput("", 10,80,200)
    $B_SEND = GUICtrlCreateButton("SENDEN", 10, 110, 200)
    GUICtrlSetOnEvent($B_SEND, "senden")
    $E_Transmit = GUICtrlCreateEdit("", 10,150,200,100)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Sleep(100)
    Until $p_end

    [/autoit] [autoit][/autoit] [autoit]

    Func _Close ()
    $p_end=1
    CLOSE()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func XGO()
    GUICtrlSetData ( $I_SEND, "XGO")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func XSTOP()
    GUICtrlSetData ( $I_SEND, "XSTOP")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func OPEN()
    $Error_2 = _CommSetPort(3, $Error_1,9600,8,0,1,0,0,0)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func CLOSE()
    _CommClosePort()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func senden()
    $output = GUICtrlRead( $I_SEND)&@CRLF
    _CommSendstring(GUICtrlRead( $I_SEND) &Chr(13))
    Sleep(50)
    $output=$output & " Zeichen: " &_CommGetInputCount() &" "&_Commgetstring()&@CRLF
    $output=$output & _Commgetstring()&@CRLF
    GUICtrlSetData ($E_Transmit,$output )
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Danke für die Hilfe!

    Muss jetzt nur noch rausbekommen wie man den Status auf geschlossen setzt.

    Ralf