请高手帮忙,关于MSCOMM控件接受二进制数据的问题(附原码)?

zpwly 2003-11-12 04:43:21
通过串口、RS232线,接受单片机发过来的二进制数!

一共两台单片机(A1、A2),发送数据的次序是这样的:
单片机先发送一个标志(是A1发的就发过来A1, 是A2发的就发过来A2)
我以十六进制的形式接受,并做好接受这个单片机数据的准备!
单片机再连续发5组数据,我接收到后以十进制在页面上显示出来!
最后发一个结束标志EE!
我这边接收到EE后不再接受单片机发过来的数据
这些数据发送间隔时很快的

现在的问题是我在接受单片机发过来的标志(A1或A2)时,连同他发过来的数据和结束标志EE一块接受了!
我的代码如下:

'设定 InputMode 读取二进制数据
MSComm1.InputMode = comInputModeBinary
'等待直到输入缓冲区有字节
'按16进制接收数据
Do Until MSComm1.InBufferCount < 10
DoEvents
Loop

'往缓冲区存二进制数据
Buffer = MSComm1.Input
'赋值于字节数组以便处理
Arr = Buffer
'按16进制接收数据
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
For i = 0 To UBound(Arr)
strTemp = strTemp & String(2 - Len(Hex(Arr(i))), "0") & Hex(Arr(i))

Next
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

问题就在这里:
这时的strTemp 中的数据是 ( A1或A2) + 5组数据 + EE
也就是把单片机所发的数据都接受到了!

请问,我该怎样才能做到先以十六进制接收到A1、A2,
在以十进制接受那5组数据!
谢谢了各位,分不够可以再加
...全文
86 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
脆皮大雪糕 2003-11-24
  • 打赏
  • 举报
回复
如果你要进行可靠的对话可以引入回复机制,也就是说单片机没法一条信息就进入等待状态,而上位机收到信息以后先判断数据包的正确性(可以在数据包的后面加上数据的校验码),然后发出一个确认回复,单片机收到确认回复以后再发出下一个数据包。如果上位机检查发现收到的数据包错误那么就发出一个错误回复,单片机收到错误回复以后将上一个数据包重发。这样做可以避免因为信号干扰而产生的错误,同时也能解决你所说的问题。当然,如果这样,单片机和上位机都必须要有超时机制,如果太长时间没有受到回复就应该认为线路发生故障。

上面所说的仅仅是一个比较简单的实现。如果要真正的进行可靠对话还要有协议封包,就好像TCP/IP协议的封包。我以前做过一个项目也是用上位机和多台单片机设备(32台左右)通讯那时候我们定义了一个数据包格式,后来证明这种定义很好地解决了线路干扰问题。
我们的协议大致如下:
起始标志 1字节
设备编号 2字节 标志数据目的地或来源地
数据长度 2字节
是否有后续包标志 1字节 数据量较大可以分包处理,该字节标志是否有后续数据包
操作类型 2字节
备用字段 2字节
数据 n字节
校验码 1字节
结束标志 1字节

以上仅作参考,希望大家能够提出更好的建议或者意见
egxsun 2003-11-20
  • 打赏
  • 举报
回复
如果只想接收A1,你需要在对接收加一个阀值(如果不设的话就为0)。还有第一次收不到,你加一个延时看看。
egxsun 2003-11-20
  • 打赏
  • 举报
回复
一起接受为什么不可以?接收到后再处理一下。
zpwly 2003-11-20
  • 打赏
  • 举报
回复
现在的问题是:
发数据呼叫单片机时第一次好像没有用!比如我发A1去呼叫A1单片机,可以触发MSComm1_OnComm事件,但是UBound(Arr)为-1!第二次在发A1进行呼叫就正常,为什么呀?
zpwly 2003-11-20
  • 打赏
  • 举报
回复
怎么加延时呀?
请高手持教!
zpwly 2003-11-12
  • 打赏
  • 举报
回复
我一下就把它发过了的数据全部都接受到了,我想先接受到A1,在接受其他的数据,有办法能做到么?
即Arr = Buffer时,Buffer只传过来A1,不接受其它数据

难道速度太快实现不了么
cryptonym 2003-11-12
  • 打赏
  • 举报
回复
你让A1只法A1等到你收到后回个什么东西的给A1,当A1收到后再发数据。这样就可以了。

不过我没有看懂你什么意思,就算你收到的是十六进制的怎么样呢,你用十进制转换一下显示不就试了吗。

7,785

社区成员

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

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