MSCOMM的oncomm事件一次只接收8个字节!!求助啊!

cnrmcu 2009-08-05 05:38:04
为什么每次都只能接收8个字节,超过8个,他就先收8个,剩下的在下一次在接收

比如说12个字节,就先收8个,再收四个,出发了两次oncomm事件
再比如说17个字节,就先收8个,再收8个,再收一个.

大家分析一下 这与什么有关?

另外不同的波特率下 比如说9600 和 52000下,仍然会出现只收8字节的情况。为什么?

...全文
1012 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
zou8203 2012-07-05
  • 打赏
  • 举报
回复
本来接收就存在不确定性
cnrmcu 2009-08-10
  • 打赏
  • 举报
回复
楼上两位动动脑筋,想想是什么原因?
咸清 2009-08-09
  • 打赏
  • 举报
回复

无语~~
贝隆 2009-08-09
  • 打赏
  • 举报
回复
关注
unsv29 2009-08-09
  • 打赏
  • 举报
回复
还有 看看这段代码打印出什么来了???


Private Sub MsComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
MSComm1.RThreshold = 0
Sleep (30)
ReDim ReceiveFrame(MSComm1.InBufferCount)
Print "MSComm1.InBufferCount" & MSComm1.InBufferCount

End Select

End Sub


unsv29 2009-08-09
  • 打赏
  • 举报
回复
竟然打印出
MSComm1.InBufferCount8
MSComm1.InBufferCount8
MSComm1.InBufferCount16
MSComm1.InBufferCount16
MSComm1.InBufferCount17
unsv29 2009-08-09
  • 打赏
  • 举报
回复
楼上, 这个MSCOMM玄机太多了


Private Sub MsComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
ReDim ReceiveFrame(MSComm1.InBufferCount)
Print "MSComm1.InBufferCount" & MSComm1.InBufferCount
If MSComm1.InBufferCount = 17 Then
MSComm1.InBufferCount = 0
End If
End Select

End Sub

单片机每发送17个字符,你猜上面这段代码打印出什么了???

太深奥了!!!
贝隆 2009-08-09
  • 打赏
  • 举报
回复
应该是延迟等待的问题,就是那个Sleep的问题
xhzhuzz 2009-08-09
  • 打赏
  • 举报
回复
我要接收有头和尾的数据,头是35 尾是“H0D”,为什么我把sleep去了就不可以了 ,且加sleep 后,有些数据有时候可以受到,有时候不可以,大家帮忙呀
MSComm1.InputMode = comInputModeBinary '采用二进制接收
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.InBufferSize = 100 '接收缓冲区大小
MSComm1.OutBufferSize = 100 '发送缓冲区大小
MSComm1.RThreshold = 1 '设置引发OnComm事件的字节长度
MSComm1.InputLen = 1 '设置Input从接收缓冲读取全部数据
MSComm1.PortOpen = True
Private Sub MSComm1_OnComm()
Sleep (500)
Select Case MSComm1.CommEvent
Case comEvReceive
Do While MSComm1.InBufferCount <> 0
indata = MSComm1.Input
If jieshouok Then
arrt(p) = indata(0)
p = p + 1
Else
If jieshouok = False And indata(0) <> 35 Then
Else
jieshouok = True
arrt(p) = indata(0)
p = p + 1
End If
End If
If indata(0) = 13 And jieshouok Then
'数据处理
p=0
end if
Loop
End Select
end sub
unsv29 2009-08-09
  • 打赏
  • 举报
回复
#27楼 串口助手和本楼主的问题 没有太大关系。即使你会编写串口调试器,也不能解决楼主的问题。

比如单片机发送30个字符给 串口助手,于是你就看到串口助手上一下子显示出了30个字符。

事实上,助手是先收到8个 又受到8个 又受到8个 又收到6个!


#27楼解释一下 这个原因是什么??

贝隆 2009-08-08
  • 打赏
  • 举报
回复
你可以等待短一点也无所谓,我给你的那个串口调试器源码有详细的使用,你看看应该有用的。我的代码是借鉴那个来的。
贝隆 2009-08-08
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 unsv29 的回复:]
回12楼 你说得没有错 是被动的  ,但是如果中途受干扰呢?

或者单片机的帧发送出去前几个字节后,单片机断电了呢??
[/Quote]

从我的感觉来说,感觉就是你的没有延迟,单片机发送数据的速率太快了,你的数据还没有处理完,就又有数据来了,所以,我个人的构思是:
1、一个一个字符的接受,触发OnComm事件
2、当触发了OnComm事件,马上把RThreshold设置为:0,这样可以避免再收到字符事触发OnComm事件,等待一小段时间,这个是必须的,等待一个完整的数据帧产过来,但具体等待多久,这个就得看实际情况了。
3、等待完毕后,就可以读缓冲区了。当然你需要对你读回来的数据进行处理判断。处理完毕后,将:RThreshold设置为:1,即可再次接收并触发事件了。

关键点在:单片机上传数据的时间间隔和通信等待时间的匹配。

以上是我的拙见。。呵呵
zdingyun 2009-08-08
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zdingyun 的回复:]
http://www.vbgood.com/viewthread.php?tid=86156&extra=&page=1
各位回复时看下LZ的上贴.
[/Quote]
zdingyun 2009-08-08
  • 打赏
  • 举报
回复
[url=http://www.vbgood.com/viewthread.php?tid=86156&extra=&page=1url]
各位回复时看下LZ的上贴.
zdingyun 2009-08-08
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 unsv29 的回复:]
回12楼 你说得没有错 是被动的  ,但是如果中途受干扰呢?

或者单片机的帧发送出去前几个字节后,单片机断电了呢??
[/Quote]
那就解决干扰问题.
单片机会断电,那找个好的UPS电源来解决断电问题.
同样电脑也会断电,LZ的情况是要在非正常工况下如何来保证通信的正常.
unsv29 2009-08-08
  • 打赏
  • 举报
回复
楼上各位 请搞清 !@!

正如12楼所说 VB是被动接受的 所以说 单片机是上位机 VB是下位机 。不要以为电脑总是下位机。
unsv29 2009-08-08
  • 打赏
  • 举报
回复
回12楼 你说得没有错 是被动的 ,但是如果中途受干扰呢?

或者单片机的帧发送出去前几个字节后,单片机断电了呢??
zdingyun 2009-08-08
  • 打赏
  • 举报
回复
各位有所不知,LZ的串口是虚拟的,它涉及建立虚拟串口的驱动.
我们一般使用实际的物理串口,为调试COM口通信,电脑往往用串口扩展卡增加物理串口.
of123 2009-08-08
  • 打赏
  • 举报
回复

至于 MSComm1.InBufferCount = 0,如果你确定下位机发送的就是 17 个字节,你也照单全收了,就多此一举。因为它已经是 0 了。
of123 2009-08-08
  • 打赏
  • 举报
回复
MSComm1.RThreshold = 17

既然确定下位机发送 17 个字节,为什么不一次完整接收。

你收到 8 个字节,是因为第一个字节触发事件,到你完成接收,缓冲区恰好收到 8 个。当然你也可以采取延时等待的方法,

Do Until MSComm1.InBufferCount >= 17
DoEvents
Loop
ReceiveFrame() = MSComm1.Input

但接收到 17 个字节再触发 OnComm 事件更直接。

如果想快,而且你确定你的代码所用的系统,包括硬件都是一致的,也可以 MSComm1.RThreshold = 10,你进入事件后,恰好收到 17 个。
加载更多回复(17)

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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