当前位置: 代码迷 >> 单片机 >> 一包串口数据回到两行数据
  详细解决方案

一包串口数据回到两行数据

热度:222   发布时间:2016-04-28 14:50:20.0
一包串口数据返回两行数据
我用串口调试助手给单片机通信。波特率300
单片机在收到数据后,返回一包数据。可是我用软件的帧换行功能,在界面上看到返回的是两包数据。不知为何?
本来应该返回
11 12 13 14 15 16 17
但实际上返回的是
11 12 13 14 15
16 17
把波特率提高后,没有这个问题。
------解决思路----------------------
这个你要自己想办法处理,在协议层上增加容错处理,因为实际中不可能都那么美好的,经常会出现一帧数据分了两次发或者刚收到一半数据后面又重发了一帧新的.
你这个算简单的了,就是帧中间有点时间间隔,不是连续发给你的.
提高波特率后在段时间内发送完毕,所以认为是一帧数据

不知道楼主在纠结什么? 如果仅仅是你用电脑PC软件(串口助手之类的)看到是2行而不是一行,你把自动换行关掉(如果有的话).
查看十六进制,如果数据是正确的,何必纠结它是一行显示还是两行显示
------解决思路----------------------
数据之间的间隔时间长
------解决思路----------------------
这个不影响什么的,发送间隔时间长,PC按照两包接收,高波特率的,你发大量数据,也会出现这种情况啊
------解决思路----------------------

这是因为串口的通讯速度很低,而 PC 端等待的时间不够长,因此只收到一部分。

如果是固定一包 10 字节数据,那你就等待收够 10 个字节再从缓存读取。
------解决思路----------------------
引用:
谢谢回复。
现在的问题是,我用VB做程序时,感觉不太好做。
如果一包数据有10个数据,就是先收到8个数据,再收到2个数据。中间感觉有一段时间。不是一次收10个数据。


这不是底层的问题,你应该在协议层做个数据包整合的功能,定义好协议,在数据开头的哪个位置给出本包数据的长度,整合够一包数据才正常处理。

就算是在Linux或windows上做socket编程,一样也会遇到先收到8个字节数据,然后是2字节数据的问题,驱动层只负责原封不动的发包收包,包数据具体的内容不是他管的,要你的代码上层做处理。
------解决思路----------------------
这个和上位机的串口软件有很大的关系,如果你的波特率太低,上位机软件接收到一个字节后,会根据时间来判断一笔数据是否发送完毕,如果在它指定的时间内仍然有数据进来,就认为这个数据和上一个数据为一组数据,如果规定时间到了,仍然没有接收到数据,就认为一组数据接收完毕,当下一次接收到数据时,就自动认为这是新的一组数据,所以波特率低的时候,这种情况就会比较多,波特率高的时候,这种情况就会比较少。
------解决思路----------------------
就算你提高了波特率,试验环境下好用了,产品仍然会不好用,因为你没有解决问题,只是隐藏。
关键在于你程序设计有误
有误在于概念混乱
串口不提供包的概念,概念是你设计出来的,得有程序结构对应你的设计,而不是想象着串口应该为你实现。
------解决思路----------------------
一般情况下,3楼 说的“数据之间的间隔时间长”是正确的。
但是vb 一次收8个数,一次只收8个数 这也是事实。看我早期的帖子  都争论这个问题。

最好的方法是VB定时一段时间后再接收。

希望你能看得懂。
  相关解决方案