用MSComm控件接收数据时不能连续接收的问题

sireen 2007-06-20 03:43:52
请教各位,我用MSComm中断事件接收串口数据,数据连续发送,每四字节为一帧,前两字节为FFH,作为帧开始,后两字节为我需要的数据,进行处理,但程序只能接收一次,附程序,请路过的高手帮我看看是什么原因。
Dim ab(3) As Byte '存储接收到的一组字节数据
Dim av As Variant '从接收缓冲区读取数据变量
With MSComm1
.InputMode = comInputModeBinary '设置接收数据为二进制形式
.InputLen = 1 'Input每次从接收缓冲区读取一字节数据
.RThreshold = 4 '接收4字节产生OnComm事件
End With

Private Sub MSComm1_OnComm()
With MSComm1
Select Case .CommEvent '判断MSComm1通讯事件
Case comEvReceive '接受到4个字节产生接收事件
av = .Input '读取第一个字节
ab(0) = av(0) '存储到字节数据类型数组
If ab(0) = &HFF Then
.RThreshold = 0 '关闭OnComm接收事件
av = .Input '读取第二个字节
ab(1) = av(0) '存储到字节数据类型数组
If ab(1) = &HFF Then '判断是否为数据开始标志
av = .Input
ab(2) = av(0)
av = .Input
ab(3) = av(0)'将两字节数据分别读取,存储到字节数据类型数组

数据处理
End If
.RThreshold = 1 '打开MSComm1接收事件
End If
End Select
End With
End Sub
...全文
938 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sireen 2007-06-23
  • 打赏
  • 举报
回复
很感谢你们!谢谢了!
sireen 2007-06-23
  • 打赏
  • 举报
回复
谢谢zdingyun和of123,我的通讯已经实现了,就是数据不太稳定。我做的是一个实时采集系统,数据流是10ms一帧,刚好四个字节。我采用zdingyun最后给我的程序能够实现通讯,但是显示在快速变换中会出现几秒的停顿,想请问是不是延时的问题?
zdingyun 2007-06-22
  • 打赏
  • 举报
回复
借用of123()的代码:
Option Explicit
Dim ab() As Byte
Dim b() As Single
'存储接收到的一组字节数据
Dim av As Variant '从接收缓冲区读取数据变量
Dim strData As String
Dim w As Variant
Private Sub Form_Load()
With MSComm1
.InputMode = comInputModeBinary '设置接收数据为二进制形式
'.InputLen = 4 'Input每次从接收缓冲区读取4字节数据
.RThreshold = 4
.PortOpen = True
'接收4字节产生OnComm事件
End With

End Sub

Private Sub MSComm1_OnComm()
With MSComm1
Select Case .CommEvent '判断MSComm1通讯事件
Case comEvReceive '接受到4个字节产生接收事件
av = .Input '读取第一个字节
ab = av '存储到字节数据类型数组
If ab(0) = &HFF And ab(1) = &HFF Then
'数据处理
strData = ab(0) & ab(1) & ab(2) & ab(3)
Text1 = strData
w = (ab(3) And &HF0) \ 16
Text2 = w
ReDim b(w)
b(w) = (ab(2) * 16 + (ab(3) And &HF)) * 0.00122
Text0(w).Text = Format(b(w), "0.00")
End If
End Select
End With
End Sub
sireen 2007-06-21
  • 打赏
  • 举报
回复
现在程序运行没有错误了 但还是接收不到数据 太苦恼了 麻烦哪位指点我一下 除了程序还可能是什么方面的错误吗?我用串口调试助手试过了 接收到的数据都正确 用VB接就没反应了
sireen 2007-06-21
  • 打赏
  • 举报
回复
我试一下 呵呵
of123 2007-06-21
  • 打赏
  • 举报
回复
这句改一下:
Dim ab() As Byte '存储接收到的一组字节数据
sireen 2007-06-21
  • 打赏
  • 举报
回复
of123 我试了一下您给的程序,提示不能给数组赋值
ab = av '存储到字节数据类型数组
这个语句是不是不能执行呀?
sireen 2007-06-21
  • 打赏
  • 举报
回复
谢谢,我明白您的意思了 可我用串口调试助手已经能够正确收到数据了 用您上面的代码接收其为字符没有反应,输入缓冲区也没有数据,想请问您还有可能是哪方面的原因?
of123 2007-06-21
  • 打赏
  • 举报
回复
Dim ab(3) As Byte '存储接收到的一组字节数据
Dim av As Variant '从接收缓冲区读取数据变量
With MSComm1
.InputMode = comInputModeBinary '设置接收数据为二进制形式
.InputLen = 4 'Input每次从接收缓冲区读取4字节数据
.RThreshold = 4 '接收4字节产生OnComm事件
End With

Private Sub MSComm1_OnComm()
With MSComm1
Select Case .CommEvent '判断MSComm1通讯事件
Case comEvReceive '接受到4个字节产生接收事件
av = .Input '读取第一个字节
ab = av '存储到字节数据类型数组
If ab(0) = &HFF And ab(1) = &HFF Then

数据处理
End If
End If
End Select
End With
End Sub
zdingyun 2007-06-21
  • 打赏
  • 举报
回复
我的代码是按二进制方式接收,然后转换为16进制的字符形式输出。你接收的一帧数据是4字节长。对接收数据处理可由MID函数取出各字节数据,按你的数据协议处理数据。
VB中16进制数据转为10进制用VAL函数:
A = VAL("&H" & "23" & "F0")
关于赋值给Text数组可使用:
FOR NEXT循环解决
由于不知道你的数据通信协议,无法提供代码。





sireen 2007-06-20
  • 打赏
  • 举报
回复
补充一下,数据处理以后在一个Text数组里显示数值 呵呵
sireen 2007-06-20
  • 打赏
  • 举报
回复
谢谢您
我想接收的后两个字节是数值型的,要进行一些处理,其中ab(2)和ab(3)是一帧数据的后两个字节,下面是我转换的程序
w = (ab(3) And &HF0) \ 16 '取通道信息
b(w) = (ab(2) * 16 + (ab(3) And &HF)) * 0.00122 '两字节数据处理为间隙数值
text0(w).Text = Format(b(w), "0.00") '间隙数值输出到对应Text控件
按您给出的程序,我用Val函数转换一下再进行处理可以吗?
还得谢谢您,这个问题困扰了N久了
zdingyun 2007-06-20
  • 打赏
  • 举报
回复
Option Explicit
Dim BytReceived() As Byte
Dim strData As String
Dim lenInput As Integer

Private Sub Form_Load()
MSComm1.CommPort = 1 'COM端口
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.RThreshold = 4 '产生MSComm事件
MSComm1.InBufferSize = 1024
MSComm1.PortOpen = True
Text1 = ""
Text3 = ""
LblJieshou = ""
Text4 = ""
Timer1.Interval = 0
End Sub

Private Sub MSComm1_OnComm()
On Error Resume Next
Dim strBuff As String
Text1 = ""
Select Case MSComm1.CommEvent
Case 2
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
jieshou
LblJieshou = Text1
lenInput = Len(LblJieshou)
Text3 = lenInput \ 2
Text2 = Mid(LblJieshou, 1, 2)
'数据处理代码
If Mid(LblJieshou, 1, 2) = "FF" Then
Text4 = Mid(LblJieshou, 5, 4)
End If
End Select
Timer1_Timer
End Sub
Public Function jieshou() '接收数据处理为16进制
Dim i As Integer
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = strData & "0" & Hex(BytReceived(i))
Else
strData = strData & Hex(BytReceived(i))
End If
Next
Text1 = strData
End Function
Private Sub Timer1_Timer()
strData = ""
End Sub
sireen 2007-06-20
  • 打赏
  • 举报
回复
上面是
.RThreshold = 4 '打开MSComm1接收事件

弄错了 呵呵

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧