背景情况
先介绍一下,并没有涉及到什么高深技术,单纯记录分享我的一些经历和踩过的坑。
公司的产品使用RS232 串口,或者说DB9接口进行控制,很多场景下需要使用软件自动控制比较方便。
产品串口通讯协议分为字符流和Modbus两种,对于非专业的我来说,自然选择字符流协议。
VB6.0中自带MsComm控件,很方便引用
首先确定设备的串口信息:
波特率:115200
数据位:8位
停止位:1位
校验位:无
下面配置一下串口
MSComm1.CommPort = “2”
MSComm1.Settings = "115200,N,8,1"
MSComm1.portopen = True
portopen.Enabled = False
然后开始对设备发送字符串的命令,我这里用了"power"控制机器的功率。
机器的命令格式如下
命令(小写) 空格 参数 换行
‘string’ ‘ ’ ‘xxx’ ‘\n’
MSComm.Output = "power " & pw & vbCrLf ’pw是我自定义的integer的变量,这个值是变化的
这样看似很简单,但是单次使用还好,连续多个命令发送肯定会丢失一些指令。于是我这里添加一个延时的功能,sleep还是别用了,卡顿不说还没用
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Public Sub TimeDelay(t As Integer)
Dim Savetime As Double
Savetime = timeGetTime '记下开始时的时间
While timeGetTime < Savetime + t '循环等待,ms为单位
DoEvents '转让控制权,以便让操作系统处理其它的事件。
Wend
End Sub
然后多个命令一起发送
MSComm.Output = "power " & pw & vbCrLf ’pw是我自定义的integer的变量,这个值是变化的
TimeDelay (100)
MSComm.Output = "freq " & prr & vbCrLf ’
这样使用发现还挺好,但是连续几十次还是有丢失指令的情况,这个问题让我很苦恼,我尝试着把延时增加到上千还是不能根治,而且和电脑还有关系。终于一次和软件工程师沟通过程中找到了原因。我一直在用一个串口通讯的软件“SecureCRT",经常用这个发送文件包也不会出错,就是因为我们在高级设置里面设置了一个参数:Character send delay为1ms。这个真的是一下点破了问题关键啊。
于是我就把这个命令分解为单个字符来发送,每个字符中间延迟1ms。下面上方法
Public Sub ComOutputDelay(Content As String)
Dim i As Integer
For i = 1 To Len(Content)
MSComm1.Output = Right(Left(Content, i), 1)
TimeDelay (1)
Next i
MSComm1.Output = vbCrLf
TimeDelay (1)
End Sub
ComOutputDelay("power " & pw & vbCrLf )
ComOutputDelay("freq " & prr & vbCrLf ’)
就这样连续发送再多指令也不出错了,而且速度也快多了。
遇到此类问题的朋友留言交流一下吧。