串口读取数据不完整该如何解决??????????

wxl565 2011-03-25 11:21:09
串口控件comm事件
Private Sub Comm_OnComm()
Dim tempstr As String
Select Case Comm.CommEvent
Case comEvReceive
tempstr = Comm.Input
End Select
End Sub
因为返回在是字符串较长,tempstr有时候读取不完整,该如何解决?
是否需要加定时器, 加延时定时器该如何加?
...全文
770 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zdingyun 2011-03-25
  • 打赏
  • 举报
回复
将Dim tempstr As String变量定义句放窗体声明处然后

Private Sub Comm_OnComm()
Select Case Comm.CommEvent
Case comEvReceive
tempstr = tempstr + Comm.Input
End Select
End Sub
心匪石不可转 2011-03-25
  • 打赏
  • 举报
回复
有可能在你处理的时候,接收那里又满了,但事件没能及时触发
zdingyun 2011-03-25
  • 打赏
  • 举报
回复
tempstr = tempstr + Comm.Input
wxl565 2011-03-25
  • 打赏
  • 举报
回复
有十几位吧,不加任何延时在话有时候只能收取到一两位
flfq 2011-03-25
  • 打赏
  • 举报
回复
字符串有多长?
心匪石不可转 2011-03-25
  • 打赏
  • 举报
回复
应该扩大接收缓存区
嗷嗷叫的老马 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wxl565 的回复:]
返回的数据长度不一致,但都是以空格 回车结尾
[/Quote]
二进制方式接收,再把所有接收到的内容都存着,直到发现了空格+回车后截断为一个字符串,扔给处理过程

剩下的继续接收追加,等待下一个空格+回车.
贝隆 2011-03-25
  • 打赏
  • 举报
回复

Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'串口属性设置,根据你的实际情况修改
Private Sub Form_Load()
With MSComm1
.CommPort = 1
.Settings = "9600,n,8,1"
.InBufferSize = 1024
.OutBufferSize = 1024
.InputLen = 1
.RThreshold = 1
.InputMode = comInputModeBinary
.PortOpen = True
End With
End Sub
'用中断方式接收数据
Private Sub MSComm1_OnComm()
Dim intP As Integer
Dim varP As Variant
Dim ReadByte(0 To 1023) As Byte '定义一个足够大的数组,用来接收串口数据
If MSComm1.CommEvent = 2 Then
MSComm1.RThreshold = 0
Sleep 20
For intP = 0 To MSComm1.InBufferCount - 1
If varP <> Null Then varP = Null
varP = MSComm1.Input
ReadByte(intP) = varP(0)
Next intP
MSComm1.RThreshold = 1
End If
End Sub

wxl565 2011-03-25
  • 打赏
  • 举报
回复
是这样的,我要向下位机发送一条命令:abc ,然后下位机要返回给我一条信息。我现在需要时时接受下位机返回的信息,实时显示在窗体上,返回的格式:P,xx,xx
我把发送命令放在一个timer控件中了,每隔100毫秒发一次命令查询,就这么简单,我如何能准确实时的得到返回的字符串?
fanlitao 2011-03-25
  • 打赏
  • 举报
回复
tempstr = tempstr + Comm.Input,每次接收后判断接受的是否已近完整
zdingyun 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wxl565 的回复:]
但是我为了实时显示串口中的数据,所以在timer中每隔100毫秒就会串口发送个询问数据, 然后就返回数据,如果采用tempstr = tempstr + Comm.Input会不会乱?
[/Quote]
可以加数据帧头和尾的标示字符判断来取舍.
flfq 2011-03-25
  • 打赏
  • 举报
回复
你先用串口调试工具试试吧,看看端口设置和指令是否正确
wxl565 2011-03-25
  • 打赏
  • 举报
回复
应该可以的 ,其实多少时间反馈无所谓啊,如果1S反馈 可以设置为1S吧 ,主要是如何去实现?
flfq 2011-03-25
  • 打赏
  • 举报
回复
你的目标设备能在200ms内反馈吗?
wxl565 2011-03-25
  • 打赏
  • 举报
回复
我就想每200ms发送一次询问命令,然后接收一组完整的反馈命令
flfq 2011-03-25
  • 打赏
  • 举报
回复
你延时多久可以收到全部数据?
wxl565 2011-03-25
  • 打赏
  • 举报
回复
返回的数据长度不一致,但都是以空格 回车结尾
wxl565 2011-03-25
  • 打赏
  • 举报
回复
但是我为了实时显示串口中的数据,所以在timer中每隔100毫秒就会串口发送个询问数据, 然后就返回数据,如果采用tempstr = tempstr + Comm.Input会不会乱?
of123 2011-03-25
  • 打赏
  • 举报
回复

串口是极低速通讯设备,它的传输赶不上 PC 程序的运行。

要么延时。如果知道长度,就检查缓存数据长度直到完成。如果事先知道长度,就改变 On_Comm 事件触发门槛。

其实最关键的是要有一个可用的协议。

7,785

社区成员

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

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