本帖最后由 yohoboy 于 2022-6-7 23:20 编辑
https://www.autoitx.com/forum.ph ... hlight=%B4%AE%BF%DA
參考看看
#AutoIt3Wrapper_UseX64=n ;因commg.dll只能在32位元系統正常使用,加上這一句不編譯也可以運行,若編輯器和我的不一樣,添加一條類似的就可以正常運行
#include 'CommMG.au3'
Dim $dCommFlag = False ;串列打開狀態標誌
$a = _OpenCom(3) ;設定及打開串列
If @error Then Exit MsgBox(0, "", $a)
$b = _SendEvent("02 5F 5f 42 20 44 03") ;發送資料
If @error Then Exit MsgBox(0, "", $b)
$c = _ReceiveEvent() ;接收資料
If @error Then
MsgBox(0, "1", $c)
Else
ConsoleWrite($c & @CRLF)
EndIf
_CloseCom() ;關閉串列
Exit
Func _OpenCom($sSetport, $sSetBaud = 9600, $sSetBits = 8, $sSetParity = 0, $sSetStop = 1, $sSetFlow = 0) ;打開串列
;~ $aSetport 串列號; $aSetBaud 串列傳輸速率; $aSetBits 數據位元; $aSetParity 校驗位NONE; $aSetStop 停止位; $aSetFlow 流控制NONE
Local $aSportSetError ;存放錯誤返回值
Local $aResOpen
$aResOpen = _CommSetPort($sSetport, $aSportSetError, $sSetBaud, $sSetBits, $sSetParity, $sSetStop, $sSetFlow)
If $aResOpen = 0 then
$dCommFlag = False
Return SetError(1, "", $aSportSetError)
Else
$dCommFlag = True ;串列打開成功
EndIf
EndFunc
Func _SendEvent($sData) ;向串列發送“每位元組用空格間隔的”Hex資料
If Not $dCommFlag Then Return SetError(1, "", "未打開串列")
Local $SendText = StringStripWS($sData, 1 + 2)
Local $SendTextArray = StringSplit($SendText, " ")
For $i = 1 To $SendTextArray[0]
_CommSendByte(Dec($SendTextArray[$i]))
Next
EndFunc
Func _ReceiveEvent() ;從串列接收資料,返回“每位元組用空格間隔的”Hex資料
If Not $dCommFlag Then Return SetError(1, "", "未打開串列")
Local $aInstr, $aReturn, $aTimer
$aTimer = TimerInit()
Do
$aInstr = _commreadbyte()
If $aInstr <> "" Then
$aReturn &= Hex($aInstr, 2) & " "
EndIf
If TimerDiff($aTimer) > 1000 And $aInstr = "" Then ;開始接收資料後1秒若無數據返回則認為資料接收已結束
ExitLoop
EndIf
Until 0
Return $aReturn
EndFunc
Func _CloseCom() ;關閉串列
If $dCommFlag Then _Commcloseport(true)
EndFunc
;此用法採用的是單字節發送和接收,應該還可以優化加快發送和接收資料的速度
;CommMG.au3發佈地址:https://www.autoitscript.com/forum/topic/128546-serial-port-com-port-udf/#comments
;CommMG.au3和commg.dll下載地址:https://www.mosaiccgl.co.uk/AutoItDownloads/confirm.php?get=COMMGvv2.zip
|