COM Objekt für RS232 Kommunikation

  • Hi,
    HextoString() verwendet intern Binarytostring, das hat nichts mit dem zu tun, was ihr senden wollt....

    Wenn also, wie im vorliegenden Fall, BYTES gesendet werden sollen, dann setzt man diesen string z.B. so zusammen:

    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    Global Const $Byte1 = 0x01
    Global Const $Byte2 = 0x02
    Global Const $Byte3 = 0xFF
    Global Const $Byte4 = BitXOR($Byte1, $Byte2, $Byte3)

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

    $string=chr($byte1)&chr($byte2)&chr($byte3)&chr($byte4)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $string = ' & $string & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ;oder
    $string=binarytostring("0x0102FFFC") ;hardkodiert
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $string = ' & $string & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ;oder
    $string=binarytostring("0x"&hex($byte1,2)&hex($byte2,2)&hex($byte3,2)&hex($byte4,2))
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $string = ' & $string & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    ;FALSCH!!!
    $string=_HexToString($Byte1 & $Byte2 & $Byte3 & $Byte4)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $string = ' & $string & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    For $i=1 to stringlen($string)
    $x=asc(stringmid($string,$i,1));asciicode der einzelnen zeichen
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $x = ' & $x & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    next

    [/autoit]
  • Danke Andy, ich habe da anders gelöst, indem ich einfach den Einschaltbefehl invertiert habe, nun schaltet auch alles ab

  • Das einzige was nun noch Fehlt ist dass ich einen pin am Comport abfragen kann und an diesen einen Schalter anschieße, wenn dieser gedrückt wird, sollen alle relais abgeschaltet werden

  • 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!

  • Hi Veronesi,Also am Comport 1 kann ich das nicht machen, aber mein Rechner hat ja 5 ComPorts, da könnte ich Einen davon nehmen, in dwie lese ich das ganze dann ein??

  • Ich habe mir mal den comport angeschaut, kann ich auch irgendwie den (RI-RingIndicator) abfragen?

  • 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!

  • 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

  • Da komme ich doch eher auf deine Variante mit RXD und GND zurück
    das scheint mir einfacher zu realisieren.
    Wenn du mir noch kurz sagen könntest wie ich das ganze dann einlesen kann (also RXD) wäre ich schon ein ganzes stück weiter.

    Gruß Rene

  • 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!

  • @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!


    Na ja, nennen wir es Intuition. ;)
    Ehrlich gesagt habe ich mir darüber keine weiteren Gedanken gemacht, weil Du ja bestätigt hast, dass das Setzen des RTS-Bits innerhalb der Funktion _OpenCOMPort mit

    [autoit]

    If $SetRTS = 1 Then $CommCtrl = BitOR($CommCtrl, 0x1001)

    [/autoit]

    funktioniert. Das kann aber nur sein, wenn die rechte 1 das LSB (fBinary) und die linke das 13. Bit (fRtsControl) ist.

    Einmal editiert, zuletzt von Großvater (27. April 2011 um 15:15)

  • Wenn ich also die CTS variante nehme muss ich ja mit PullUpWiederständen abreiten, so wie ich es gesehen hab
    aber ich könnte alles über eine Schnittstelle lösen oder?
    und mit der UDF von dir müsste ich dann ein 1 oder 0 signal bekommen, wenn ich es richtig gesehen habe.

  • 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!

  • SUper, Funzt einwandfrei mit CTS
    habe es grad mal ausprobiert, muss nun nur noch die schleife hinbekommen


    Vielen Vielen Dank
    Veronesi

  • 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

  • Also ich hab des ganze jetzt erst mal mit der While Schleife gemacht, mit dem AdlibRegister hab ich noch nie was gemacht
    Wenn du mir da ein bisschen was sagen kannst versuch ich des gern mal!

    Aber die UDF Funzt fantastisch
    muss nu noch nen bissl was einbauen dann kann das ganze in den Produktivbetrieb gehen!

  • 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??

  • Nein Die UDF ist so vollkommen ausreichend für mich
    werde das ganze dann mal testen mit dem AdLibregister

    Danke erst mal, wenn ich noch was finde sag ich bescheid

  • Tut mir leid das ich diesen alten Thread wieder eröffne, jedoch habe ich ein kleines Problem.
    Ich bin nicht der begabteste mit der Programmiersprache AutoIt, darum bitte ich um etwas Rücksicht bei Erklärungen etc. ;)

    Ich nutze das hier genannte Script um einen Sensor über die RS 232-Schnittstelle zu steuern.
    Die Kommunikation an sich funktioniert.
    Es ist mir möglich den Laser des Sensors ein-, sowie auch auszuschalten, jedoch erhalte ich kein
    Antworttelegramm des Sensors, welcher definitiv einen ausgibt (laut Betriebsanleitung und getestet mit HyperTerminal).


    Das ist der bisherige (gekürzte) Quellcode:

    [autoit]

    #include "rs232.udf"
    #include <Array.au3>

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

    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Global $ports = _GetComPorts() ; Wieviele COM-PORTS gibt es? (Ergebnis ist ein Array)
    Global $anz_ports = UBound($ports) ; Anzahl der entdeckten COM-Ports
    if $anz_ports = 0 Then ; Keine COM-Ports gefunden?
    MsgBox(4096,"Fehler", "Es konnte keine COM-Schnittstelle gefunden werden!", 8)
    Exit
    EndIf

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

    ; Technische Daten der Wenglor-Schnittstelle:
    ; Baudrate: 38400 Baud, 8 Datenbit, keine Parität, 1 Stopbit
    Global Const $ComPort = 1
    Global Const $Baudrate = 38400
    Global Const $Bits = 8
    Global Const $Parity = 0
    Global Const $Stopp = 0
    Global Const $Rts = 1

    [/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]

    Global Const $MinBufferSize = 11
    Global Const $MaxWaitTime = 800
    Global Const $CommSerialPort = 1

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

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

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

    _SendSerialString($SendPort, String($Byte1 & $Byte2 & $Byte3 & $Byte4))
    Sleep(100)

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

    ;Laer aktiviert
    _SendSerialString($SendPort, String("/020L0150."))
    Sleep(500)
    MsgBox(0, string(_ReceiveStringWait($ComPort, $MinBufferSize, $MaxWaitTime)), 100, 100)
    Sleep(1500)

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

    ;Laser deaktiviert
    _SendSerialString($SendPort, String("/020L0051."))
    Sleep(500)
    MsgBox(0, string(_ReceiveStringWait($ComPort, $MinBufferSize, $MaxWaitTime)), 100, 100)
    Sleep(10000)

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

    ;Laser aktiviert
    _SendSerialString($SendPort, String("/020L0150."))
    Sleep(500)
    MsgBox(0,string(_ReceiveStringWait($ComPort, $MinBufferSize, $MaxWaitTime)), 100, 100)
    Sleep(100)

    [/autoit]

    An den jeweils fett gedruckten Teilen des Programms habert es und ich bekomme lediglich eine "100" in der MsgBox ausgegeben.
    Falls es interessant sein sollte, hier der Link zum Betriebshandbuch , dort stehen auch die Antworttelegramme welche eigentlich ausgegeben werden müssten!
    Es handelt sich um den Sensor CP35MHT80

    Vielen Dank! :)