最近在使用VB写一个自动化控制的程序时,碰到了下面的问题,在程序中我要将一串字符串命令通过串口发送到下位机,为了对发送/接收的数据进行更准确的判断,还使用了CRC16校验方法来对要发送的命令来进行校验, 即在命令的后面再加上2个字节的校验码,但在实际调试时却发现,下位机收到的2个字节的校验码均为0,心中对这个现象一直不解,出错的代码如下:
Dim CRC16 As New CRCCom 'CRC16校验的COM组件
Dim nCrcValue As Long
cmdMsg = "1234567890"
CRC16.GetCrc16Value cmdMsg, nCrcValue
cmdMsg = cmdMsg & Chr(nCrcValue / 256) & Chr(nCrcValue Mod 256)
MSC1.Settings = strBaud
MSC1.CommPort = nPort
MSC1.InputMode = comInputModeText
MSC1.OutBufferCount = 0
MSC1.PortOpen = True
MSC1.Output = cmdMsg
上面这段代码执行后,下位机收到的"1234567890"后面2个字节均为0,经过查阅资料,我发现Chr这个函数在转换大于128的数时,转换后就是变为0,难怪下位机老是报错,解决的办法有2种,一是使用VC来封装一个串口通讯的COM来完成串口通讯的工作,同时将数据校验也放在里面进行,VB程序只负责具体的命令和数据的处理,可是这个工作量不小,另一个办法是试一下MSComm控件能不能支持在已经打开串口之后随时变换发送的模式(即是采用文本模式还是二进制模式),如果可以的话我就可以先使用文本模式于是我想到了先使用文本模式将"1234567890"发送出去,然后再使用二进制模式将校验得到的2个字节以字节数组的方式发送出去,经过测试,果然可以这样进行,这就给了我很大的方便了,修改测试过后的代码如下:
Dim CRC16 As New CRCCom 'CRC16校验的COM组件
Dim nCrcValue As Long
Dim byCrcValue(1) As Byte
CRC16.GetCrc16Value cmdMsg, nCrcValue
byCrcValue(0) = Chr(nCrcValue / 256)
byCrcValue(1) = Chr(nCrcValue Mod 256)
cmdMsg = "1234567890"
CRC16.GetCrc16Value cmdMsg, nCrcValue
cmdMsg = cmdMsg & Chr(nCrcValue / 256) & Chr(nCrcValue Mod 256)
MSC1.Settings = strBaud
MSC1.CommPort = nPort
MSC1.OutBufferCount = 0
MSC1.PortOpen = True
MSC1.InputMode = comInputModeText
MSC1.Output = cmdMsg
MSC1.InputMode = comInputModeBinary
MSC1.Output = byCrcValue