1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. veronesi

Beiträge von veronesi

  • Objekte übergeben

    • veronesi
    • 2. Mai 2011 um 07:58

    Hallo zusammen,

    ich habe zwei Scripts, welche beide mit Objekten (Dictionary.Scripting) arbeiten.

    Lasse ich beide Scripte einzeln laufen, so braucht jedes Script ca. 1 Minute. Hintereinander ausgeführt also ca. 2 Minuten.
    Nun möchte ich beide Scripte "parallel" ausführen lassen. Ich habe beide einzeln mal als EXE erzeugt und gleichzeitig ausgeführt. Sie sind beide nach total 1 Minute 1 Sekunde fertig. Also eine enorme Zeitersparnis, wenn ich beide parallel ausführen lasse! (Später wird dann noch mehr indiziert, so dass die Ausführdauer massiv länger ist!)

    Da ich in einem weiteren Script die Dictionary weiterverarbeiten sollte, wollte ich nach einer Möglichkeit fragen, die Objekte aus den einzelnen (externen) Funktionen zu meinem Hauptprogramm zu übergeben. (Muss ich ja, denn AutoIt kann keine Tasks "parallel" ausführen).
    Die Objekte in Arrays abzufüllen und zu übergeben, oder gar in einem File zu speichern, kommt aus Zeitgründen nicht in Frage, da momentan etwa 7 Millionen Einträge pro Dictionary vorhanden ist. (Deshalb auch keine Arrays, weil dort bei 16 Millionen Einträgen schluss ist. Ich brauche später vermutlich 20 - 30 Millionen Einträge)

    Wie ist das Möglich? Oder können die wie Variablen übergeben werden? (Beispiele dazu habe ich in diesem Forum gefunden)

    Vielen Dank
    Veronesi

  • TaskScheduler / Aufgabenplaner mittels ObjCreate("Schedule.Service") ansteuern

    • veronesi
    • 1. Mai 2011 um 20:11

    Warum nimmst Du dann nicht einfach den Parameter $Arguments (Zweitletzter Parameter....)?

    Veronesi

  • TaskScheduler / Aufgabenplaner mittels ObjCreate("Schedule.Service") ansteuern

    • veronesi
    • 1. Mai 2011 um 17:49

    Hallo Anna,
    also ohne Code kann ich nur raten.
    Aber wenn Du Probleme mit der Parameterüberhabe hast, so würde ich mir mal das foldende Beispiel ansehen:

    [autoit]

    #include <Array.au3>
    If $CmdLine[0] = 0 Then ;Keine Parameter übergeben!
    Dim $Parameter[1] = [0]
    Else
    Dim $Parameter[$CmdLine[0]]
    For $i = 1 To $CmdLine[0]
    $Parameter[$i - 1] = $CmdLine[$i]
    Next
    EndIf

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

    _ArrayDisplay($Parameter)

    [/autoit]

    So kannst Du in AutoIt Parameter einlesen.
    In $CmdLine[0] steht drin, wieviele Parameter (wenn überhaupt) vorhanden sind.
    So kannst Du die Parameter einlesen und dann ganz normal eine Funktion mit diesen Parametern aufrufen.

    Grüsse Veronesi

  • EDID / DDC Daten direkt vom Monitor lesen

    • veronesi
    • 30. April 2011 um 10:03

    Ich habe mir den Link nun selber mal genauer angeschaut und gesehen, dass es wohl sehr kompliziert werden würde, das auszulesen.
    Kennt denn jemand wenigstens ein unter Windows7 64bit lauffähiges Programm um die EDID (DDC) Daten direkt vom Monitor zu lesen und das ganze irgendwie per StdOut/In in AutoIt einzulesen?

    PS: das Programm softMCCS kenne ich, lässt sich aber nicht automatisieren und funktioniert unter Win7 / 64bit nicht immer zuverlässig.

    Vielen Dank für Eure Inputs!

  • EDID / DDC Daten direkt vom Monitor lesen

    • veronesi
    • 29. April 2011 um 19:25

    Ich muss (direkt vom Monitor) die DDC Daten auslesen und diese dann weiterverarbeiten.
    Es gibt diverse Lösungen, aber die lesen alle bloss die Registry aus oder verwenden externe Tools die leider nicht unter Win7 64Bit laufen.

    Die Registry kann ich nicht verwenden, da an diesen PC laufend neue Monitore (im laufenden Betrieb) angeschlossen werden. Bei diesen Monitoren muss geprüft werden, ob sie DDC Daten korrekt senden.

    Hier habe ich was interessantes gefunden. Kann das jemand in AutoIt umsetzen?
    Link

    Vielen Dank für Eure Hilfe!
    Veronesi

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 27. April 2011 um 19:53

    Schau mal in der Hilfe nach AdlibRegister.
    Damit kannst Du einfach ausgedrückt eine art Timer erstellen.

    Die dort definierte Funktion wird dann periodisch aufgerufen. Mit dem vorgegebenen Zeitwert. Das Hauptprogramm wird dann also kurz unterbrochen (Interrupt).

    In der Funktion könntest Du also deine Bits abfragen und entsprechen reagieren.

    Brauchst Du noch was in der UDF??

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 27. April 2011 um 16:29

    Bitte gerne geschehen!
    Schön, dass die UDF zu funktionieren scheint!

    Die Schleife sollte ja einfach sein.
    1. Port öffnen
    2. Schleife mit CTS abfragen (Sleep nicht vergessen)
    3. Port schliessen.

    Oder Du kannst es ja auch mit einem AdlibRegister lösen, dass Du alle z.B. 500ms den Status abfragst. Dann hast Du das Main frei für weitere Dinge (Kommunikation mit der Relaiskarte)

    Grüsse, Veronesi

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 27. April 2011 um 15:12

    Ja, wenn Du das CTS und RTS für deine Relaiskarte nicht brauchts (glaubs eher nicht), dann kannst Du das mit einer Schnittstelle lösen.
    Meine UDF gibt eine 1 oder 0 zurück, je nachdem ob das CTS gesetzt oder nicht gesetzt ist.

    Aber Du musst das Ganze trotzdem in einer Schleife periodisch abfragen, sonst, verpasst Du den Tastendruck!

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 27. April 2011 um 15:03

    Ich bin mir nicht sicher, ob das einfacher ist oder ob das überhaupt funktioniert!
    Wenn Du den RxD auf GND hängst (mit dem Taster), und Du dann von dieser seriellen Schnittstelle einen String empfangen möchtest, werden lauter 1sen kommen.

    Welcher String das dann ist, musst Du durch probieren herausfinden.
    - Also RxD auf GND
    - Währenddessen den String einlesen (_ReceiveStringWait)
    - Dann den Taster loslassen (RxD nicht mehr auf GND
    - Nun den String erneut einlesen (_ReceiveStringWait)

    Der Unterschied zwischen den beiden Strings, wenn dies denn wirklich klappen sollte, kannst Du auswerten.
    Nachteil ist natürlich, dass Du in einer Endlosschleife den RxD abfragen musst, ob dieses "Signal" kommt!

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 27. April 2011 um 14:57

    Hier die neue UDF mit welcher Du auch das CTS abfragen kannst:

    Spoiler anzeigen
    [autoit]

    #cs
    UDF cfx.au3
    serial functions using kernel32.dll
    V1.0
    Uwe Lahni 2008
    V2.0
    Andrew Calcutt 05/16/2009 - Started converting to UDF
    V2.1
    Mikko Keski-Heroja 02/23/2011 - UDF is now compatible with Opt("MustDeclareVars",1) and Date.au3. Global variable $dll is renamed to $commDll.
    V2.2
    Veronesi 04/26/2011 - Changed some cosmetics and documentation / Add Function to set RTS and to get DCD Status
    #ce
    #include-once
    Global $commDll
    Global $hSerialPort
    Global $dcb_Struct
    Global $commtimeout
    Global $commtimeout_Struct
    Global $commState

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

    ;====================================================================================
    ; Function Name: _OpenCOMPort($CommPort, $CommBaud, $CommBits, $CommParity, $CommStop, $SetRTS)
    ; Description: Opens serial port
    ; Parameters: $CommPort
    ; $CommBits - 4-8
    ; $CommParity - 0=none, 1=odd, 2=even, 3=mark, 4=space
    ; $CommStop - 0 => 1 Stop bit / 1 => 1.5 Stop bits / 2 => 2 Stop bits
    ; $SetRTS - 0 = RTS => 0 / 1 = RTS => 1 / 2 = RTS handshake / 3 = RTS toggle
    ; Returns: on success, returns serial port id?
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _OpenCOMPort($CommPort, $CommBaud = '9600', $CommBits = '8', $CommParity = '0', $CommStop = '0', $SetRTS = 0)
    #cs
    CommCtrl => fBitfields => http://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx
    http://www.hpcc.ecs.soton.ac.uk/software/Win32API.Txt
    ' The fourteen actual DCB bit-sized data fields within the four bytes of fBitFields can be manipulated by bitwise logical And/Or operations.
    ' FieldName Bit # Description
    ' ----------------- ----- ------------------------------
    ' fBinary 1 binary mode, no EOF check
    ' fParity 2 enable parity checking
    ' fOutxCtsFlow 3 CTS output flow control
    ' fOutxDsrFlow 4 DSR output flow control
    ' fDtrControl 5 DTR flow control type (2 bits)
    ' fDsrSensitivity 7 DSR sensitivity
    ' fTXContinueOnXoff 8 XOFF continues Tx
    ' fOutX 9 XON/XOFF out flow control
    ' fInX 10 XON/XOFF in flow control
    ' fErrorChar 11 enable error replacement
    ' fNull 12 enable null stripping
    ' fRtsControl 13 RTS flow control (2 bits)
    ' fAbortOnError 15 abort reads/writes on error
    ' fDummy2 16 reserved
    #ce

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

    Local Const $RTS_CONTROL_DISABLE = 0x0000
    Local Const $RTS_CONTROL_ENABLE = 0x1000
    Local Const $RTS_CONTROL_HANDSHAKE = 0x2000
    Local Const $RTS_CONTROL_TOGGLE = 0x3000
    Local $CommCtrl
    $commDll = DllOpen("kernel32.dll")
    Local $dcbs = "long DCBlength;long BaudRate; long fBitFields;short wReserved;" & _
    "short XonLim;short XoffLim;byte Bytesize;byte parity;byte StopBits;byte XonChar; byte XoffChar;" & _
    "Byte ErrorChar;Byte EofChar;Byte EvtChar;short wReserved1"

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

    Local $commtimeouts = "long ReadIntervalTimeout;long ReadTotalTimeoutMultiplier;" & _
    "long ReadTotalTimeoutConstant;long WriteTotalTimeoutMultiplier;long WriteTotalTimeoutConstant"

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

    Local Const $GENERIC_READ_WRITE = 0xC0000000
    Local Const $OPEN_EXISTING = 3
    Local Const $FILE_ATTRIBUTE_NORMAL = 0x80

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

    $dcb_Struct = DllStructCreate($dcbs)
    If @error Then Return SetError(1, 1, -1)

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

    $commtimeout_Struct = DllStructCreate($commtimeouts)
    If @error Then Return SetError(1, 1, -1)

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

    $hSerialPort = DllCall($commDll, "hwnd", "CreateFile", "str", "COM" & $CommPort, _
    "int", $GENERIC_READ_WRITE, _
    "int", 0, _
    "ptr", 0, _
    "int", $OPEN_EXISTING, _
    "int", $FILE_ATTRIBUTE_NORMAL, _
    "int", 0)
    If @error Then Return SetError(1, 1, -1)
    If Number($hSerialPort[0]) < 1 Then Return SetError(1, 1, -1)
    $commState = DllCall($commDll, "long", "GetCommState", "hwnd", $hSerialPort[0], "ptr", DllStructGetPtr($dcb_Struct))

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

    $CommCtrl = BitAND($CommCtrl, 0xFFFCFFF) ; RTS-Bits löschen
    Switch $SetRTS
    Case 0
    Case 1
    $CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_ENABLE)
    Case 2
    $CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_HANDSHAKE)
    Case 3
    $CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_TOGGLE)
    Case Else
    Return SetError(1, 1, -1)
    EndSwitch

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

    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "DCBLength", DllStructGetSize($dcb_Struct))
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "BaudRate", $CommBaud)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "Bytesize", $CommBits)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "fBitfields", Number($CommCtrl))
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "Parity", $CommParity)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "StopBits", '0x' & $CommStop)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "XonLim", 2048)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "XoffLim", 512)
    If @error Then Return SetError(1, 1, -1)
    $commState = DllCall($commDll, "short", "SetCommState", "hwnd", $hSerialPort[0], "ptr", DllStructGetPtr($dcb_Struct))
    If @error Then Return SetError(1, 1, -1)

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

    If $commState[0] = 0 Then Return SetError(1, 1, -1)
    DllStructSetData($commtimeout_Struct, "ReadIntervalTimeout", -1)
    $commtimeout = DllCall($commDll, "long", "SetCommTimeouts", "hwnd", $hSerialPort[0], "ptr", DllStructGetPtr($commtimeout_Struct))
    If @error Then Return SetError(1, 1, -1)
    Return Number($hSerialPort[0])
    EndFunc ;==>_OpenCOMPort

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

    ;====================================================================================
    ; Function Name: _CloseCOMPort($CommSerialPort)
    ; Description: Closes serial port
    ; Parameters: $CommSerialPort - value returned by _OpenComm
    ; Returns: on success, returns 1
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _CloseCOMPort($CommSerialPort)
    Local $closeerr = DllCall($commDll, "int", "CloseHandle", "hwnd", $CommSerialPort)
    DllClose($commDll)
    If @error Then Return SetError(1, 1, -1)
    Return ($closeerr[0])
    EndFunc ;==>_CloseCOMPort

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

    ;====================================================================================
    ; Function Name: _SendSerialString($CommSerialPort, $sSensString)
    ; Description: Send a String
    ; Parameters: $CommSerialPort - value returned by _OpenComm
    ; $sSendString - String to send
    ; Returns: on success, returns 1
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _SendSerialString($CommSerialPort, $sSendString)
    Local $lptr0 = DllStructCreate("long_ptr")
    DllCall($commDll, "int", "WriteFile", "hwnd", $CommSerialPort, _
    "str", $sSendString, _
    "int", StringLen($sSendString), _
    "long_ptr", DllStructGetPtr($lptr0), _
    "ptr", 0)
    If @error Then Return SetError(1, 1, -1)
    EndFunc ;==>_SendSerialString

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

    ;====================================================================================
    ; Function Name: _ReceiveStringWait($CommSerialPort, $MinBufferSize, $MaxWaitTime)
    ; Description: Recieves data
    ; Parameters: $CommSerialPort - value returned by _OpenComm
    ; $MinBufferSize - Buffer size to wait for
    ; $MaxWaitTime - Maximum time to wait before failing
    ; Returns: on success, returns String
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _ReceiveStringWait($CommSerialPort, $MinBufferSize, $MaxWaitTime)
    Local $rxbuf
    Local $jetza = TimerInit()
    Local $lptr0 = DllStructCreate("long_ptr")

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

    Local $rxr, $rxl, $to
    Do
    $rxr = DllCall($commDll, "int", "ReadFile", "hwnd", $CommSerialPort, _
    "str", " ", _
    "int", 1, _
    "long_ptr", DllStructGetPtr($lptr0), _
    "ptr", 0)
    If @error Then Return SetError(1, 1, -1)
    $rxl = DllStructGetData($lptr0, 1)
    If $rxl >= 1 Then
    $rxbuf &= $rxr[2]
    EndIf
    $to = TimerDiff($jetza)
    Until StringLen($rxbuf) >= $MinBufferSize Or $to > $MaxWaitTime
    Return ($rxbuf)
    EndFunc ;==>_ReceiveStringWait

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

    ;====================================================================================
    ; Function Name: _SetCOMRTS($commPort, $RTS)
    ; Description: Sets RTS flow control
    ; Parameters: $CommPort - value returned by _OpenComm
    ; $RTS : 0 = disable, 1 = enable
    ; Returns: on success, returns 1
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _SetCOMRTS($CommPort, $SetRTS)
    ;http://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx
    Local $EscapeComm, $RTS
    If Number($CommPort) < 1 Then Return SetError(1, 1, -1)
    Switch $SetRTS
    Case 0
    $RTS = 4
    Case 1
    $RTS = 3
    Case Else
    Return SetError(1, 1, -1)
    EndSwitch
    $EscapeComm = DllCall($CommDll, "BOOL", "EscapeCommFunction", "HWND", $CommPort, "DWORD", $RTS)
    If @error Or ($EscapeComm[0] = 0) Then Return SetError(1, 1, -1)
    Return True
    EndFunc ;==>_SetCOMRTS

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

    ;====================================================================================
    ; Function Name: _GetCOMDCD($commPort)
    ; Description: Gets DCD status (Set from RTS in 0-Modem Cable)
    ; Parameters: $CommPort - value returned by _OpenComm
    ; Returns: on success, returns value
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _GetCOMDCD($CommPort)
    ; http://msdn.microsoft.com/en-us/library/…8(v=vs.85).aspx
    Local $CommCtrl, $lpModemStat
    If Number($CommPort) < 1 Then Return SetError(1, 1, -1)
    $lpModemStat = DllStructCreate("DWORD")
    $CommState = DllCall($CommDll, "BOOL", "GetCommModemStatus", "HWND", $CommPort, "Ptr", DllStructGetPtr($lpModemStat))
    If @error Or ($CommState[0] = 0) Then Return SetError(1, 1, -1)
    $CommCtrl = DllStructGetData($lpModemStat, 1)
    If BitAND($CommCtrl, 0x80) Then Return 1 ; Isolate DCD (RLSD)
    Return 0
    EndFunc ;==>_GetCOMDCD

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

    ;====================================================================================
    ; Function Name: _GetCOMCTS($commPort)
    ; Description: Gets CTS status
    ; Parameters: $CommPort - value returned by _OpenComm
    ; Returns: on success, returns value
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _GetCOMCTS($CommPort)
    ; http://msdn.microsoft.com/en-us/library/…8(v=vs.85).aspx
    Local $CommCtrl, $lpModemStat
    If Number($CommPort) < 1 Then Return SetError(1, 1, -1)
    $lpModemStat = DllStructCreate("DWORD")
    $CommState = DllCall($CommDll, "BOOL", "GetCommModemStatus", "HWND", $CommPort, "Ptr", DllStructGetPtr($lpModemStat))
    If @error Or ($CommState[0] = 0) Then Return SetError(1, 1, -1)
    $CommCtrl = DllStructGetData($lpModemStat, 1)
    If BitAND($CommCtrl, 0x10) Then Return 1 ; Isolate CTS
    Return 0
    EndFunc ;==>_GetCOMCTS

    [/autoit]

    Grüsse, Veronesi

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 27. April 2011 um 14:52

    Schau mal in diesen Link
    Du könntest den RTS auf 1 setzen. Dann das CTS abfragen. (Müsste man aber vermutlich noch in die UDF einbauen)

    Ist der Taster gedrückt, so wird das CTS quasi über das RTS gesetzt!

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 27. April 2011 um 14:43

    Vielleicht könntest Du den Schalter am Pin 2 (RxD) und Pin 5 (GND) anschliessen. Dann das RX Signal lesen.
    Ist der Schalter gedrückt, dann ist RxD auf GND. Sonst ist RxD auf ~ -12V

    Andy:
    Vielen Dank für die Aufklärung. Ich lerne gerne was dazu!

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 27. April 2011 um 11:50

    Chr(0) ergibt das Zeichen des Ascii Codes 0. Und das ist kein darstellbares Zeichen.
    Die Zahl 0 beginnt bei Dezimal 48!
    Ascii 48 = Dezimal 0
    Ascii 49 = Dezimal 1...

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 27. April 2011 um 08:33

    @Grossvater:
    Dann wird also die DCB Struktur bzw. das fBitField in umgekehrter Reihenfolge gelesen?
    DCB Struktur
    Ich glaubte, dass das fBinary das MSB und die 17x fDummy2 die LSB sind.

    Woher sehe ich, dass es anderst rum ist?
    Danke!

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 27. April 2011 um 08:25

    @Rene
    Wenn Du für die Relaiskarte 1 Stop-Bit brauchst, musst Du das Stop-Bit auf 0 setzen! (War in der alten UDF falsch/irreführend beschrieben.)
    Also irgendwie so:

    Spoiler anzeigen
    [autoit]

    #include "Func_Serial.au3"
    #Include <String.au3>

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

    ;Alle Konstanten müssen angepasst werden!
    ;Gemäss Spezifikationen der Karte!
    Global Const $ComPort = 3
    Global Const $Baudrate = 19200
    Global Const $Bits = 8
    Global Const $Parity = 0
    Global Const $Stop = 0
    Global Const $Rts = 0

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

    Global Const $Byte1 = 0x01
    Global Const $Byte2 = 0x02
    Global Const $Byte3 = 0xFF
    Global Const $Byte4 = BitXOR($Byte1, $Byte2, $Byte3)

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

    Local $SendPort = _OpenCOMPort($ComPort, $Baudrate, $Bits, $Parity, $Stop, $Rts)
    If $SendPort = -1 Then MsgBox(0, "Fehler", "Der COM-Port konnte nicht geöffnet werden!")

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

    _SendSerialString($SendPort, _HexToString($Byte1 & $Byte2 & $Byte3 & $Byte4))
    Sleep(500)
    _CloseCOMPort($SendPort)

    [/autoit]

    @Grossvater / @all
    Vielen Dank für Deine / Eure Unterstützung.
    Ich habe nun eine sehr gute UDF, welche ich einsetzen kann. Mal sehen ob später noch Fehler darin auftauchen!

    Beste Grüsse und Danke!

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 27. April 2011 um 07:56

    So, nun konnte ich das RTS auch noch im laufenden Betrieb setzen!
    Nun funktioniert alles (was ich wollte) einwandfrei.
    Und das ohne externe (bzw. ohne M$ fremde) Dll!

    Hier die "fertige" UDF:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #cs
    UDF cfx.au3
    serial functions using kernel32.dll
    V1.0
    Uwe Lahni 2008
    V2.0
    Andrew Calcutt 05/16/2009 - Started converting to UDF
    V2.1
    Mikko Keski-Heroja 02/23/2011 - UDF is now compatible with Opt("MustDeclareVars",1) and Date.au3. Global variable $dll is renamed to $commDll.
    V2.2
    Veronesi 04/26/2011 - Changed some cosmetics and documentation / Add Function to set RTS and to get DCD Status
    #ce
    #include-once
    Global $commDll
    Global $hSerialPort
    Global $dcb_Struct
    Global $commtimeout
    Global $commtimeout_Struct
    Global $commState

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

    ;====================================================================================
    ; Function Name: _OpenCOMPort($CommPort, $CommBaud, $CommBits, $CommParity, $CommStop, $SetRTS)
    ; Description: Opens serial port
    ; Parameters: $CommPort
    ; $CommBits - 4-8
    ; $CommParity - 0=none, 1=odd, 2=even, 3=mark, 4=space
    ; $CommStop - 0 => 1 Stop bit / 1 => 1.5 Stop bits / 2 => 2 Stop bits
    ; $SetRTS - 0 = RTS => 0 / 1 = RTS => 1 / 2 = RTS handshake / 3 = RTS toggle
    ; Returns: on success, returns serial port id?
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _OpenCOMPort($CommPort, $CommBaud = '9600', $CommBits = '8', $CommParity = '0', $CommStop = '0', $SetRTS = 0)
    #cs
    CommCtrl => fBitfields => http://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx
    http://www.hpcc.ecs.soton.ac.uk/software/Win32API.Txt
    ' The fourteen actual DCB bit-sized data fields within the four bytes of fBitFields can be manipulated by bitwise logical And/Or operations.
    ' FieldName Bit # Description
    ' ----------------- ----- ------------------------------
    ' fBinary 1 binary mode, no EOF check
    ' fParity 2 enable parity checking
    ' fOutxCtsFlow 3 CTS output flow control
    ' fOutxDsrFlow 4 DSR output flow control
    ' fDtrControl 5 DTR flow control type (2 bits)
    ' fDsrSensitivity 7 DSR sensitivity
    ' fTXContinueOnXoff 8 XOFF continues Tx
    ' fOutX 9 XON/XOFF out flow control
    ' fInX 10 XON/XOFF in flow control
    ' fErrorChar 11 enable error replacement
    ' fNull 12 enable null stripping
    ' fRtsControl 13 RTS flow control (2 bits)
    ' fAbortOnError 15 abort reads/writes on error
    ' fDummy2 16 reserved
    #ce

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

    Local Const $RTS_CONTROL_DISABLE = 0x0000
    Local Const $RTS_CONTROL_ENABLE = 0x1000
    Local Const $RTS_CONTROL_HANDSHAKE = 0x2000
    Local Const $RTS_CONTROL_TOGGLE = 0x3000
    Local $CommCtrl
    $commDll = DllOpen("kernel32.dll")
    Local $dcbs = "long DCBlength;long BaudRate; long fBitFields;short wReserved;" & _
    "short XonLim;short XoffLim;byte Bytesize;byte parity;byte StopBits;byte XonChar; byte XoffChar;" & _
    "Byte ErrorChar;Byte EofChar;Byte EvtChar;short wReserved1"

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

    Local $commtimeouts = "long ReadIntervalTimeout;long ReadTotalTimeoutMultiplier;" & _
    "long ReadTotalTimeoutConstant;long WriteTotalTimeoutMultiplier;long WriteTotalTimeoutConstant"

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

    Local Const $GENERIC_READ_WRITE = 0xC0000000
    Local Const $OPEN_EXISTING = 3
    Local Const $FILE_ATTRIBUTE_NORMAL = 0x80

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

    $dcb_Struct = DllStructCreate($dcbs)
    If @error Then Return SetError(1, 1, -1)

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

    $commtimeout_Struct = DllStructCreate($commtimeouts)
    If @error Then Return SetError(1, 1, -1)

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

    $hSerialPort = DllCall($commDll, "hwnd", "CreateFile", "str", "COM" & $CommPort, _
    "int", $GENERIC_READ_WRITE, _
    "int", 0, _
    "ptr", 0, _
    "int", $OPEN_EXISTING, _
    "int", $FILE_ATTRIBUTE_NORMAL, _
    "int", 0)
    If @error Then Return SetError(1, 1, -1)
    If Number($hSerialPort[0]) < 1 Then Return SetError(1, 1, -1)
    $commState = DllCall($commDll, "long", "GetCommState", "hwnd", $hSerialPort[0], "ptr", DllStructGetPtr($dcb_Struct))

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

    $CommCtrl = BitAND($CommCtrl, 0xFFFCFFF) ; RTS-Bits löschen
    Switch $SetRTS
    Case 0
    Case 1
    $CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_ENABLE)
    Case 2
    $CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_HANDSHAKE)
    Case 3
    $CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_TOGGLE)
    Case Else
    Return SetError(1, 1, -1)
    EndSwitch

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

    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "DCBLength", DllStructGetSize($dcb_Struct))
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "BaudRate", $CommBaud)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "Bytesize", $CommBits)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "fBitfields", Number($CommCtrl))
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "Parity", $CommParity)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "StopBits", '0x' & $CommStop)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "XonLim", 2048)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "XoffLim", 512)
    If @error Then Return SetError(1, 1, -1)
    $commState = DllCall($commDll, "short", "SetCommState", "hwnd", $hSerialPort[0], "ptr", DllStructGetPtr($dcb_Struct))
    If @error Then Return SetError(1, 1, -1)

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

    If $commState[0] = 0 Then Return SetError(1, 1, -1)
    DllStructSetData($commtimeout_Struct, "ReadIntervalTimeout", -1)
    $commtimeout = DllCall($commDll, "long", "SetCommTimeouts", "hwnd", $hSerialPort[0], "ptr", DllStructGetPtr($commtimeout_Struct))
    If @error Then Return SetError(1, 1, -1)
    Return Number($hSerialPort[0])
    EndFunc ;==>_OpenCOMPort

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

    ;====================================================================================
    ; Function Name: _CloseCOMPort($CommSerialPort)
    ; Description: Closes serial port
    ; Parameters: $CommSerialPort - value returned by _OpenComm
    ; Returns: on success, returns 1
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _CloseCOMPort($CommSerialPort)
    Local $closeerr = DllCall($commDll, "int", "CloseHandle", "hwnd", $CommSerialPort)
    DllClose($commDll)
    If @error Then Return SetError(1, 1, -1)
    Return ($closeerr[0])
    EndFunc ;==>_CloseCOMPort

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

    ;====================================================================================
    ; Function Name: _SendSerialString($CommSerialPort, $sSensString)
    ; Description: Send a String
    ; Parameters: $CommSerialPort - value returned by _OpenComm
    ; $sSendString - String to send
    ; Returns: on success, returns 1
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _SendSerialString($CommSerialPort, $sSendString)
    Local $lptr0 = DllStructCreate("long_ptr")
    DllCall($commDll, "int", "WriteFile", "hwnd", $CommSerialPort, _
    "str", $sSendString, _
    "int", StringLen($sSendString), _
    "long_ptr", DllStructGetPtr($lptr0), _
    "ptr", 0)
    If @error Then Return SetError(1, 1, -1)
    EndFunc ;==>_SendSerialString

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

    ;====================================================================================
    ; Function Name: _ReceiveStringWait($CommSerialPort, $MinBufferSize, $MaxWaitTime)
    ; Description: Recieves data
    ; Parameters: $CommSerialPort - value returned by _OpenComm
    ; $MinBufferSize - Buffer size to wait for
    ; $MaxWaitTime - Maximum time to wait before failing
    ; Returns: on success, returns String
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _ReceiveStringWait($CommSerialPort, $MinBufferSize, $MaxWaitTime)
    Local $rxbuf
    Local $jetza = TimerInit()
    Local $lptr0 = DllStructCreate("long_ptr")

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

    Local $rxr, $rxl, $to
    Do
    $rxr = DllCall($commDll, "int", "ReadFile", "hwnd", $CommSerialPort, _
    "str", " ", _
    "int", 1, _
    "long_ptr", DllStructGetPtr($lptr0), _
    "ptr", 0)
    If @error Then Return SetError(1, 1, -1)
    $rxl = DllStructGetData($lptr0, 1)
    If $rxl >= 1 Then
    $rxbuf &= $rxr[2]
    EndIf
    $to = TimerDiff($jetza)
    Until StringLen($rxbuf) >= $MinBufferSize Or $to > $MaxWaitTime
    Return ($rxbuf)
    EndFunc ;==>_ReceiveStringWait

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

    ;====================================================================================
    ; Function Name: _SetCOMRTS($commPort, $RTS)
    ; Description: Sets RTS flow control
    ; Parameters: $CommPort - value returned by _OpenComm
    ; $RTS : 0 = disable, 1 = enable
    ; Returns: on success, returns 1
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _SetCOMRTS($CommPort, $SetRTS)
    ;http://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx
    Local $EscapeComm, $RTS
    If Number($CommPort) < 1 Then Return SetError(1, 1, -1)
    Switch $SetRTS
    Case 0
    $RTS = 4
    Case 1
    $RTS = 3
    Case Else
    Return SetError(1, 1, -1)
    EndSwitch
    $EscapeComm = DllCall($CommDll, "BOOL", "EscapeCommFunction", "HWND", $CommPort, "DWORD", $RTS)
    If @error Or ($EscapeComm[0] = 0) Then Return SetError(1, 1, -1)
    Return True
    EndFunc ;==>_SetCOMRTS

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

    ;====================================================================================
    ; Function Name: _GetCOMDCD($commPort)
    ; Description: Gets DCD status (Set from RTS in 0-Modem Cable)
    ; Parameters: $CommPort - value returned by _OpenComm
    ; Returns: on success, returns value
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _GetCOMDCD($CommPort)
    ; http://msdn.microsoft.com/en-us/library/…8(v=vs.85).aspx
    Local $CommCtrl, $lpModemStat
    If Number($CommPort) < 1 Then Return SetError(1, 1, -1)
    $lpModemStat = DllStructCreate("DWORD")
    $CommState = DllCall($CommDll, "BOOL", "GetCommModemStatus", "HWND", $CommPort, "Ptr", DllStructGetPtr($lpModemStat))
    If @error Or ($CommState[0] = 0) Then Return SetError(1, 1, -1)
    $CommCtrl = DllStructGetData($lpModemStat, 1)
    If BitAND($CommCtrl, 0x80) Then Return 1 ; Isolate DCD (RLSD)
    Return 0
    EndFunc ;==>_GetCOMDCD

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

    Grüsse
    Veronesi

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 27. April 2011 um 07:46

    @Rene
    Hast Du die Konstanten angepasst? Richtige Bitzahl und Portnummer?
    Kannst Du den Port mit einem Hyperterminal überhaupt öffnen?

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 27. April 2011 um 07:44

    So, meine UDF sieht nun folgendermassen aus:

    Spoiler anzeigen
    [autoit]

    #cs
    UDF cfx.au3
    serial functions using kernel32.dll
    V1.0
    Uwe Lahni 2008
    V2.0
    Andrew Calcutt 05/16/2009 - Started converting to UDF
    V2.1
    Mikko Keski-Heroja 02/23/2011 - UDF is now compatible with Opt("MustDeclareVars",1) and Date.au3. Global variable $dll is renamed to $commDll.
    V2.2
    Veronesi 04/26/2011 - Changed some cosmetics and documentation
    #ce
    #include-once
    Global $commDll
    Global $hSerialPort
    Global $dcb_Struct
    Global $commtimeout
    Global $commtimeout_Struct
    Global $commState
    ;~ Global $commState_Struct
    ;~ Global Const $STX = Chr(2)
    ;~ Global Const $ETX = Chr(3)
    ;~ Global Const $EOT = Chr(4)
    ;~ Global Const $ENQ = Chr(5)
    ;~ Global Const $ACK = Chr(6)
    ;~ Const $NAK = Chr(15)
    ;~ Const $DLE = Chr(16)

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

    ;====================================================================================
    ; Function Name: _OpenCOMPort($CommPort, $CommBaud, $CommBits, $CommParity, $CommStop, $SetRTS)
    ; Description: Opens serial port
    ; Parameters: $CommPort
    ; $CommBits - 4-8
    ; $CommParity - 0=none, 1=odd, 2=even, 3=mark, 4=space
    ; $CommStop - 0,1,5,2
    ; $SetRTS - 0 = RTS => 0 / 1 = RTS => 1 / 2 = RTS handshake / 3 = RTS toggle
    ; Returns: on success, returns serial port id?
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _OpenCOMPort($CommPort, $CommBaud = '9600', $CommBits = '8', $CommParity = '0', $CommStop = '0', $SetRTS = 0)
    #cs
    CommCtrl => fBitfields => http://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx
    http://www.hpcc.ecs.soton.ac.uk/software/Win32API.Txt
    ' The fourteen actual DCB bit-sized data fields within the four bytes of fBitFields can be manipulated by bitwise logical And/Or operations.
    ' FieldName Bit # Description
    ' ----------------- ----- ------------------------------
    ' fBinary 1 binary mode, no EOF check
    ' fParity 2 enable parity checking
    ' fOutxCtsFlow 3 CTS output flow control
    ' fOutxDsrFlow 4 DSR output flow control
    ' fDtrControl 5 DTR flow control type (2 bits)
    ' fDsrSensitivity 7 DSR sensitivity
    ' fTXContinueOnXoff 8 XOFF continues Tx
    ' fOutX 9 XON/XOFF out flow control
    ' fInX 10 XON/XOFF in flow control
    ' fErrorChar 11 enable error replacement
    ' fNull 12 enable null stripping
    ' fRtsControl 13 RTS flow control (2 bits)
    ' fAbortOnError 15 abort reads/writes on error
    ' fDummy2 16 reserved
    #ce

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

    Local Const $RTS_CONTROL_DISABLE = 0x0000
    Local Const $RTS_CONTROL_ENABLE = 0x1000
    Local Const $RTS_CONTROL_HANDSHAKE = 0x2000
    Local Const $RTS_CONTROL_TOGGLE = 0x3000
    Local $CommCtrl
    $commDll = DllOpen("kernel32.dll")
    Local $dcbs = "long DCBlength;long BaudRate; long fBitFields;short wReserved;" & _
    "short XonLim;short XoffLim;byte Bytesize;byte parity;byte StopBits;byte XonChar; byte XoffChar;" & _
    "Byte ErrorChar;Byte EofChar;Byte EvtChar;short wReserved1"

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

    Local $commtimeouts = "long ReadIntervalTimeout;long ReadTotalTimeoutMultiplier;" & _
    "long ReadTotalTimeoutConstant;long WriteTotalTimeoutMultiplier;long WriteTotalTimeoutConstant"

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

    Local Const $GENERIC_READ_WRITE = 0xC0000000
    Local Const $OPEN_EXISTING = 3
    Local Const $FILE_ATTRIBUTE_NORMAL = 0x80
    ;~ Local Const $NOPARITY = 0
    ;~ Local Const $ONESTOPBIT = 0

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

    $dcb_Struct = DllStructCreate($dcbs)
    If @error Then Return SetError(1, 1, -1)

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

    $commtimeout_Struct = DllStructCreate($commtimeouts)
    If @error Then Return SetError(1, 1, -1)

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

    $hSerialPort = DllCall($commDll, "hwnd", "CreateFile", "str", "COM" & $CommPort, _
    "int", $GENERIC_READ_WRITE, _
    "int", 0, _
    "ptr", 0, _
    "int", $OPEN_EXISTING, _
    "int", $FILE_ATTRIBUTE_NORMAL, _
    "int", 0)
    If @error Then Return SetError(1, 1, -1)
    If Number($hSerialPort[0]) < 1 Then Return SetError(1, 1, -1)
    $commState = DllCall($commDll, "long", "GetCommState", "hwnd", $hSerialPort[0], "ptr", DllStructGetPtr($dcb_Struct))

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

    $CommCtrl = BitAND($CommCtrl, 0xFFF3FFFF) ; RTS-Bits löschen
    Switch $SetRTS
    Case 0
    Case 1
    $CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_ENABLE)
    Case 2
    $CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_HANDSHAKE)
    Case 3
    $CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_TOGGLE)
    Case Else
    Return SetError(1, 1, -1)
    EndSwitch

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

    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "DCBLength", DllStructGetSize($dcb_Struct))
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "BaudRate", $CommBaud)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "Bytesize", $CommBits)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "fBitfields", Number($CommCtrl))
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "Parity", $CommParity)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "StopBits", '0x' & $CommStop)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "XonLim", 2048)
    If @error Then Return SetError(1, 1, -1)
    DllStructSetData($dcb_Struct, "XoffLim", 512)
    If @error Then Return SetError(1, 1, -1)
    $commState = DllCall($commDll, "short", "SetCommState", "hwnd", $hSerialPort[0], "ptr", DllStructGetPtr($dcb_Struct))
    If @error Then Return SetError(1, 1, -1)

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

    If $commState[0] = 0 Then Return SetError(1, 1, -1)
    DllStructSetData($commtimeout_Struct, "ReadIntervalTimeout", -1)
    $commtimeout = DllCall($commDll, "long", "SetCommTimeouts", "hwnd", $hSerialPort[0], "ptr", DllStructGetPtr($commtimeout_Struct))
    If @error Then Return SetError(1, 1, -1)
    Return Number($hSerialPort[0])
    EndFunc ;==>_OpenCOMPort

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

    ;====================================================================================
    ; Function Name: _CloseCOMPort($CommSerialPort)
    ; Description: Closes serial port
    ; Parameters: $CommSerialPort - value returned by _OpenComm
    ; Returns: on success, returns 1
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _CloseCOMPort($CommSerialPort)
    Local $closeerr = DllCall($commDll, "int", "CloseHandle", "hwnd", $CommSerialPort)
    DllClose($commDll)
    If @error Then Return SetError(1, 1, -1)
    Return ($closeerr[0])
    EndFunc ;==>_CloseCOMPort

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

    ;====================================================================================
    ; Function Name: _SendSerialString($CommSerialPort, $sSensString)
    ; Description: Send a String
    ; Parameters: $CommSerialPort - value returned by _OpenComm
    ; $sSendString - String to send
    ; Returns: on success, returns 1
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _SendSerialString($CommSerialPort, $sSendString)
    Local $lptr0 = DllStructCreate("long_ptr")
    DllCall($commDll, "int", "WriteFile", "hwnd", $CommSerialPort, _
    "str", $sSendString, _
    "int", StringLen($sSendString), _
    "long_ptr", DllStructGetPtr($lptr0), _
    "ptr", 0)
    If @error Then Return SetError(1, 1, -1)
    EndFunc ;==>_SendSerialString

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

    ;====================================================================================
    ; Function Name: _ReceiveStringWait($CommSerialPort, $MinBufferSize, $MaxWaitTime)
    ; Description: Recieves data
    ; Parameters: $CommSerialPort - value returned by _OpenComm
    ; $MinBufferSize - Buffer size to wait for
    ; $MaxWaitTime - Maximum time to wait before failing
    ; Returns: on success, returns String
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _ReceiveStringWait($CommSerialPort, $MinBufferSize, $MaxWaitTime)
    Local $rxbuf
    Local $jetza = TimerInit()
    Local $lptr0 = DllStructCreate("long_ptr")

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

    Local $rxr, $rxl, $to
    Do
    $rxr = DllCall($commDll, "int", "ReadFile", "hwnd", $CommSerialPort, _
    "str", " ", _
    "int", 1, _
    "long_ptr", DllStructGetPtr($lptr0), _
    "ptr", 0)
    If @error Then Return SetError(1, 1, -1)
    $rxl = DllStructGetData($lptr0, 1)
    If $rxl >= 1 Then
    $rxbuf &= $rxr[2]
    EndIf
    $to = TimerDiff($jetza)
    Until StringLen($rxbuf) >= $MinBufferSize Or $to > $MaxWaitTime
    Return ($rxbuf)
    EndFunc ;==>_ReceiveStringWait

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

    ;====================================================================================
    ; Function Name: _SetCOMRTS($commPort, $RTS)
    ; Description: Sets RTS flow control
    ; Parameters: $CommPort - value returned by _OpenComm
    ; $RTS : 0 = disable, 1 = enable, 2 = handshake, 3 = toggle
    ; Returns: on success, returns 1
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _SetCOMRTS($CommPort, $RTS)
    ; http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx
    Local Const $RTS_CONTROL_DISABLE = 0x0000
    Local Const $RTS_CONTROL_ENABLE = 0x1000
    Local Const $RTS_CONTROL_HANDSHAKE = 0x2000
    Local Const $RTS_CONTROL_TOGGLE = 0x3000
    Local $CommCtrl
    If Number($CommPort) < 1 Then Return SetError(1, 1, -1)
    $CommState = DllCall($CommDll, "BOOL", "GetCommState", "HWND", $CommPort, "Ptr", DllStructGetPtr($dcb_Struct))
    If @error Or ($CommState[0] = 0) Then Return SetError(1, 1, -1)
    $CommCtrl = DllStructGetData($dcb_Struct, "fBitfields")
    $CommCtrl = BitAND($CommCtrl, 0xFFF3FFFF) ; RTS-Bits löschen
    Switch $RTS
    Case 0
    Case 1
    $CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_ENABLE)
    Case 2
    $CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_HANDSHAKE)
    Case 3
    $CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_TOGGLE)
    Case Else
    Return SetError(1, 1, -1)
    EndSwitch
    DllStructSetData($dcb_Struct, "fBitfields", Number($CommCtrl))
    $CommState = DllCall($CommDll, "BOOL", "SetCommState", "HWND", $CommPort, "Ptr", DllStructGetPtr($dcb_Struct))
    If @error Or ($CommState[0] = 0) Then Return SetError(1, 1, -1)
    Return True
    EndFunc ;==>_SetCOMRTS

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

    ;====================================================================================
    ; Function Name: _GetCOMDCD($commPort)
    ; Description: Gets DCD status (Set from RTS in 0-Modem Cable)
    ; Parameters: $CommPort - value returned by _OpenComm
    ; Returns: on success, returns value
    ; on failure returns -1 and sets @error to 1
    ; Note:
    ;====================================================================================
    Func _GetCOMDCD($CommPort)
    ; http://msdn.microsoft.com/en-us/library/…8(v=vs.85).aspx
    Local $CommCtrl, $lpModemStat
    If Number($CommPort) < 1 Then Return SetError(1, 1, -1)
    $lpModemStat = DllStructCreate("DWORD")
    $CommState = DllCall($CommDll, "BOOL", "GetCommModemStatus", "HWND", $CommPort, "Ptr", DllStructGetPtr($lpModemStat))
    If @error Or ($CommState[0] = 0) Then Return SetError(1, 1, -1)
    $CommCtrl = DllStructGetData($lpModemStat, 1)
    If BitAND($CommCtrl, 0x80) Then Return 1 ; Isolate DCD (RLSD)
    Return 0
    EndFunc ;==<GetCOMDCD

    [/autoit]

    Es ist mir nun gelungen, das DCD abzufragen.
    Ich weiss zwar nicht, warum das DCD auf der Empfängerseite gesetzt wird, wenn ich das RTS setze, aber ich habe es bei unseren Geräten getestet und mit einem gekauften seriellen Programm geprüft. Es ist so...!
    Nun müsste ich nur noch das RTS im laufenden Betrieb setzen können! Das habe ich noch nicht geschafft!

    Veronesi

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 26. April 2011 um 20:23

    Im Dokument von Greenhorn habe ich noch etwas wichtiges gefunden.
    Ich suche gar nicht das DTR oder DCR! Es war das DCD bzw. M$ scheint es DSR zu nennen ;) (Bei Kollegen in einer Delphi Komponente hiess es aber DCD....)

    Also das RTS ist schon mal gut. Leider kann man es nur einmal setzen und nicht mehr zurücksetzen... Aber immerhin.

    Und das DCD sollte man über GetCommModemStatus erfragen können. Aber leider konnte ich noch nicht herausfinden, wie das geht!

  • COM Objekt für RS232 Kommunikation

    • veronesi
    • 26. April 2011 um 19:52

    @Grossvater:
    Nur ganz kurz:
    Müsste anstelle von BitAND($CommCtrl, 0xFFFCFFFF) nicht BitAND($CommCtrl, 0xFFF3FFFF) heissen?
    Wie dem auch sei. Beides funktioniert nicht GANZ.
    Ich kann zwar das RTS setzen, aber dann nie mehr zurücksetzen, bis der Port geschlossen wird....
    (Vielleicht geht das gar nicht anders, weil es steht ja: Enables the RTS line when the device is opened and leaves it on)

    Greenhorn:
    Danke für den Link. Ich habe mal da noch drin gelesen, aber komme leider immer noch nicht ganz von selber auf die Lösung.

    Lg Veronesi

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™