VB中 MSComm小问题!!数据顺序

来自:    更新日期:早些时候
用VB中的MSCOMM编个程序读取串口数据~

Option Explicit'强制变量声明
Private Sub Command1_Click() '发送
Dim number As Integer'定义整型
Dim outbyte(0) As Byte '定义字节数组
number = Val(Text1.Text)'转为数值型
outbyte(0) = CByte(number) '转化为字节型
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.Output = outbyte '发送

End Sub'结束

Private Sub Command2_Click()'按钮单击事件
MSComm1.PortOpen = False'关闭串口
Unload Form1'卸载form1
End Sub

Private Sub Form_Load()'窗体载入事件
MSComm1.CommPort = 1 '设置串口为com1
MSComm1.Settings = "9600,n,8,1" '通讯参数 波特率 奇偶校验 数据位 停止位
MSComm1.InputMode = comInputModeBinary '二进制接收
MSComm1.PortOpen = True '打开串口
MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.RThreshold = 1 '缓冲区中接收到一个字符,就产生一次OnComm事件
End Sub

Private Sub MSComm1_OnComm() '有数据传送时触发
Dim indata As Variant'定义变量
Dim arr(0) As Byte'定义字节数组
Select Case MSComm1.CommEvent ''CommEvent属性:返回最近的通讯事件或错误。通过对它具体属性值的查询,我们就可以获得通讯事件和通 讯错误的完整信息。当其值是comEvReceive时表示接收到数据。
Case comEvReceive '有接收事件
indata = MSComm1.Input '接收到的数据存放到indata里
arr(0) = AscB(indata) '返回indata的值
Text2.Text = arr(0)'在text2中显示数据
MSComm1.InBufferCount = 0' 清空接收缓冲区
End Select
End Sub
在窗体中添加
text1显示发送数据,
text2显示接收数据,
command1发送按钮,
mscomm1通讯控件,
该看懂了吧,再看不懂我没办法了,

Private Sub Form_Load()
'设置打开端口
; If OpenPort(3) = False Then
MsgBox "串口打开失败!"
End If
End Sub

Private Sub Command1_Click()
Dim sBuf(2) As Byte
sBuf(0) = &H55
sBuf(1) = &H31
sBuf(2) = &HFF
If SendByte(sBuf) = False Then

End If
End Sub

'收到数据产生MSComm事件
Private Sub MSComm1_OnComm()
Dim i As Integer
Dim rBuf() As Byte
rBuf = MSComm1.Input
For i = 0 To UBound(rBuf)
Debug.Print rBuf(i)
Next i
End Sub

'串口初始化
Private Function OpenPort(PortNum As Integer) As Boolean
On Error GoTo ErrExit '出错转移到ErrExIT处理
WITh Me.MSComm1
.CommPort = PortNum '端口号
.Settings = "9600,n,8,1" '波特率=9600bps;n(无奇偶校验)e(偶校验)o(奇校验);8位数据位;1位停止位
.InputMode = 1 '采用二进制数据传输
.NullDiscard = False 'NULL字符从端口传送到接受缓冲区
.DTREnable = False 'DTR线无效
.EOFEnable = False '不寻找EOF符
.RTSEnable = False 'RTS线无效
.InBufferCount = 0 '清空接受缓冲区
.OutBufferCount = 0 '清空传输缓冲区
.SThreshold = 0 '不产生MSComm事件
.RThreshold = 1 '产生MSComm事件
.InputLen = 0 '当输入占用时,告诉控件读入整个缓冲区。
.InBufferSize = 256 '接收缓冲区 默认为1024个字节
.OutBufferSize = 256 '发送缓冲区 默认为512个字节
.PortOpen = True '打开端口
End WITh
OpenPort = True '标明串口打开
; ExIT Function '函数结束
ErrExIT: '错误处理
OpenPort = False '标明串口打开失败
End Function '函数结束

'以二进制发送byte数组
Private Function SendByte(Buf() As Byte) As Boolean
On Error GoTo ErrExit '出错转移到ErrExIT处理
WITh MSComm1
.OutBufferCount = 0 '清空接收缓冲区
.Output = Buf '发送数据
End WITh
SendByte = True '标明数据发送成功
ExIT Function '函数结束
ErrEx
IT: '错误处理
SendByte = False '标明串口发送失败
End Function

呵呵,刚开始搞这个吧?
想每次都刚好接收到符合预期的数据是一种天真的想法。因为下位机向上送数据是有风险的,谁也不能保证数据肯定正确。作为一个考虑完善的程序,不能寄希望于运气好,而应该设法纠错。
对于你这种情况,最好的办法就是设置一个缓冲池,来了数据一股脑扔进去。然后在缓冲池中寻找合适的数据段,如果没有就继续等待,如果有了就提取出来进行处理。

具体的简单说一下:
你先定义一个模块级的 Byte() 作为缓冲池,像你这个应用,10个字节就够了。例如:Dim Buff(10) as Byte。再定义一个尾指针,记录当前池底在几号(其实也可以用Buff(0)来干这活儿)。

你把 RThreshold 改为1,每收到1个字节就放进去。代码我就不写了,很简单。
再后面就是处理过程了。你可以放在 OnComm 事件里,也可以放一个 Timer 定时处理。
从池底向上寻找标记A,找到后判断这个帧长度够不够,若够再判断是否是正确的帧,最后拿出来处理。

实际上,绝大多数的商业工控软件都是这么写的,好处很多。慢慢体会吧。

这控件干嘛用的不懂


VB中 MSComm小问题!!数据顺序视频

相关评论:

相关主题精彩

版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

Copyright © 喜物网