我也是自己摸索開發出來的每壹款VBtoCOM通訊,有具體的思路如下:
給妳推薦壹個工具“com串口測試工具 ComTone V1.0 中文綠色版”
1、打開妳的噪音計的測試軟件,調整好串口號、通訊頻率等等,我用溫度計舉例說明。
開始查詢後有返回數值,這個Receive:就是返回的數值000304012200004b05,
打開串口監視精靈,監視軟件的com口事件:
這裏面的Write是測試軟件發出的查詢指令,read是設備返回的數據指令
Private?Sub?Command1_Click()?'發送指令If?Not?MSComm1.PortOpen?Then
MSComm1.CommPort?=?7?'串口為7 MSComm1.Settings?=?"9600,n,8,1" MSComm1.InBufferCount?=?0?'清除接收緩沖區 MSComm1.OutBufferCount?=?0?'清除發送緩沖區 MSComm1.InputMode?=?comInputModeBinary?'二進制接收 MSComm1.InputLen?=?0?'讀取接收緩沖區的所有字符 MSComm1.PortOpen?=?True?'打開串口 MSComm1.RTSEnable?=?False?'置為發送狀態End?If
Dim?pu()?As?Byte
Dim?strdata?As?String
Dim?crc_js()?As?Byte
ReDim?pu(7)?'這個數組是8位的查詢指令
pu(0)?=?"&H00"?'溫度計地址
pu(1)?=?"&H03"?'查詢指令
pu(2)?=?"&H00"?'2、3為溫度計地址
pu(3)?=?"&H00"?'2、3為溫度計地址
pu(4)?=?"&H00"?'4、5為讀取寄存器長度
pu(5)?=?"&H02"?'4、5為讀取寄存器長度
pu(6)?=?"&HC5"?'6、7為CRC校驗碼?因為我們不知道設備的CRC校驗規則所以用測試軟件產生的校驗碼
pu(7)?=?"&HDA"?'6、7為CRC校驗碼
MSComm1.Output?=?pu
'不做任何事情,僅僅允許其它應用程序處理它們的事件。
DoEvents
MSComm1.InBufferCount?=?0?'清除接收緩沖區
MSComm1.RThreshold?=?9?'所要接收的數據長度,我們通過COM檢測精靈看到了回傳數據壹***是9字節
MSComm1.RTSEnable?=?True?'轉為接收狀態
End?Sub
Private?Sub?Command2_Click()
Timer1.Enabled?=?False
End?Sub
Private?Sub?Form_Unload(Cancel?As?Integer)
If?MSComm1.PortOpen?Then
MSComm1.PortOpen?=?False?'關閉串口
End?If
Timer1.Enabled?=?False
End?Sub
Private?Sub?MSComm1_OnComm()?'COM事件
Dim?PA()?As?Byte
Dim?PB?As?String
Select?Case?MSComm1.CommEvent
Case?comEvReceiveMSComm1.InputLen?=?0?'讀取接收緩沖區的所有字符
PB?=?MSComm1.Input
PA()?=?PB
For?i?=?0?To?UBound(PA())
'Print?"PA("?&?i?&?")";?PA(i)
If?Len(Hex(PA(i)))?=?1?Then
strdata?=?strdata?&?"0"?&?Hex(PA(i))
Else
strdata?=?strdata?&?Hex(PA(i))
End?If
Next
'回傳的數據串:000304012600000AC4,這9字節根據通訊協議我們進行拆分
'00為協議內回傳機號,03為讀命令,04為返回的數據長度?0126?為我要的溫度數據為十六進制表達,下面我進行數據處理
wd?=?CLng("&H"?&?Left(Right(strdata,?12),?4))?/?10?&?"℃"'根據通訊協議換算成溫度
Text1?=?Text1?&?vbCrLf?&?strdata?&?"?"?&?wd
strdata?=?""
MSComm1.PortOpen?=?False?'關閉串口
End?SelectEnd?Sub
Private?Sub?Timer1_Timer()
Call?Command1_Click
End?Sub
這是我的測試結果。
下面是通訊協議
這個是我的軟件用檢測精靈檢測的結果