串口如何控制字符串的接收?

lhpaiti 2012-05-22 10:02:40
我用个CB6.0的MSComm控件做串口通信程序,每次接收一条字符串比如“AA 04 00 00 99 99 00 04”;还有就是每条字符串都是以“AA“ 开头,字符串的长度不确定。
我想问的就是,如何控制接收到的字符串是一条完整的(不考虑传输上的丢失)。 因为多个串口以高频率向同一个串口发送数据的话,可能会使接收的那个串口接收到错乱的字符。
比如 A、B分别向C发送“AA 04 00 00 99 99 00 04”、“AA 01 00 00 99 99 04 10 04 08 04 1D ”。如果平率过快的话,C接收的可能是“AA 04 00 AA 01 00……”这样的字符。显然不是A和B所发的那种格式的字符了。。
求解决!!!在线等!!!
...全文
477 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhpaiti 2012-05-24
  • 打赏
  • 举报
回复
非常感谢各位的建议,谢啦!!
御猫 2012-05-23
  • 打赏
  • 举报
回复
不知你的硬件是怎么样的,单说说串口,你如果这样做的话,软件工作量非常大,要自己制定协议进行控制,你可以参照485总线的方式来做,不然,会很麻烦。如果实时性非常强的话,建议用串口服务器吧。或从硬件上想办法吧
  • 打赏
  • 举报
回复
好吧.各楼说的都对...
那个啥.. 检测总线是否忙挺简单的...判断下 .. over...
zhengmeifu 2012-05-23
  • 打赏
  • 举报
回复
1楼说得有道理:你要测底解决这个问题就要实行总线仲裁,想用总线前必须先检测总线是否忙。可以采用串口发送数据前先检测发送线是否在一段时间内都保持高电平,若是就允许使用总线,否则延时一段时间再检测判断。
DAISARU 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
不知你的硬件是怎么样的,单说说串口,你如果这样做的话,软件工作量非常大,要自己制定协议进行控制,你可以参照485总线的方式来做,不然,会很麻烦。如果实时性非常强的话,建议用串口服务器吧。或从硬件上想办法吧
[/Quote]

楼上说得对啊,解决方法无非是软件或者硬件。
软件:完善协议,增加报文头尾,报文长度及校验位
硬件:在驱动里做流控,参照RS485
DAISARU 2012-05-22
  • 打赏
  • 举报
回复
增加报文长度字段及CRC字段
woshi_ziyu 2012-05-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
我用个CB6.0的MSComm控件做串口通信程序,每次接收一条字符串比如“AA 04 00 00 99 99 00 04”;还有就是每条字符串都是以“AA“ 开头,字符串的长度不确定。
我想问的就是,如何控制接收到的字符串是一条完整的(不考虑传输上的丢失)。 因为多个串口以高频率向同一个串口发送数据的话,可能会使接收的那个串口接收到错乱的字符。
比如 A、B分别向C发送“……
[/Quote]
数据校验 如果不是希望的数据就丢弃
  • 打赏
  • 举报
回复
没写过串口的.没用过啥CB6.0.
仅说点I2C通信方面的,不知道能不能帮到LZ..另我顺便也看看别人咋说的...

总线通信中有个词,叫“总线仲裁”.
当一个设备获得总线后(比如从设备1),他向主设备发送数据,其它从设备2,3...此时就不能使用总线,继而不会造成LZ所说情况。
另,LZ所说多个串口一直发, 我猜想应该是有发送、接收缓冲区的。 用不了总线时,会一直往buf里写,满了之后,就看系统的设置了,有溢出的,有挂起等待的。

没写过串口的,不过猜测原理相通,一根地一根电源一根时钟一根数据....
lhpaiti 2012-05-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
多个串口以高频率向同一个串口发送数据
关于这个并发的问题,由于你用的是串口,只能够用串行通讯。当用串行通讯方法做并发的时候,你只能把并发的操作放到队列里面,然后再从队列里一个一个的向串口进行收发,这样才能确保每一个的收发正常
[/Quote]
能否详细点?求源码,求真相!!
一介布衣萧萧 2012-05-22
  • 打赏
  • 举报
回复
多个串口以高频率向同一个串口发送数据
关于这个并发的问题,由于你用的是串口,只能够用串行通讯。当用串行通讯方法做并发的时候,你只能把并发的操作放到队列里面,然后再从队列里一个一个的向串口进行收发,这样才能确保每一个的收发正常
lhpaiti 2012-05-22
  • 打赏
  • 举报
回复
换种问法:如何才能使C接收到的数据不是A和B的混合体。。
lhpaiti 2012-05-22
  • 打赏
  • 举报
回复
回复2楼:

“AA 04 00 00 99 99 00 04”、“AA 01 00 00 99 99 04 10 04 08 04 1D” 这两条数据中的最后两位也就是“04”和"1D"就是从第二个开始到倒数第二个的XOR操作。
比如第一条数据:0x04^0x00^0x00^0x99^0x99^0x00=0x04
第二条:0x01^0x00^0x00^9x99^0x99^0x04^0x10^0x04^0x08^0x04=0x1D
所以,最关键的是如何获取最后那个校验码也就是上面的“04”“1D”两个字符。。这也就是我所要问的。。

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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