VB 6.0中串口通讯降低误码率

博客讲述了在VB6中使用MsComm控件进行串口通讯时遇到的指令丢失问题,通过引入字符发送延迟解决了这一问题。作者详细分析了串口配置、命令格式以及如何通过发送单个字符并间隔1ms来确保指令的完整发送,从而提高了串口通讯的可靠性。
摘要由CSDN通过智能技术生成

背景情况
先介绍一下,并没有涉及到什么高深技术,单纯记录分享我的一些经历和踩过的坑。
公司的产品使用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 ’)

就这样连续发送再多指令也不出错了,而且速度也快多了。
遇到此类问题的朋友留言交流一下吧。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值