打印
[STM32F1]

粘包的问题

[复制链接]
3110|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Cjy_JDxy|  楼主 | 2017-9-13 10:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写 串口数据收发处理程序,和其他同事写的上位机通讯。
经常发生粘包的问题,就是有时候一包数据发送的时候,中间
时间慢了一点,对方接收就会认为两包,从而导致校验和或者
帧头错误。可是串口调试助手试,没发现粘包,一帧数据都是
连在一起发送的。请问高手,如何解决?谢谢!
沙发
candysnape| | 2017-9-13 10:42 | 只看该作者
之前做上位机的同事说,PC端串口控件是定时上报接收数据的。
具体的记不清,但原理我理解为,不论什么时间点发数据,控件每隔100ms(假设值)上报接收数据到缓冲区。
这样如果在99ms的时候开始发数据,共10ms发完,那么无论中间时间多快,数据包都是会被拆分成两包的。

使用特权

评论回复
板凳
gujiamao12345| | 2017-9-13 10:46 | 只看该作者
你们定的协议是什么样的

使用特权

评论回复
地板
玄德| | 2017-9-13 10:50 | 只看该作者

用时间特征来分,这样的协议不好。


使用特权

评论回复
5
Cjy_JDxy|  楼主 | 2017-9-13 11:11 | 只看该作者
candysnape 发表于 2017-9-13 10:42
之前做上位机的同事说,PC端串口控件是定时上报接收数据的。
具体的记不清,但原理我理解为,不论什么时间 ...

谢谢

使用特权

评论回复
6
Cjy_JDxy|  楼主 | 2017-9-13 11:15 | 只看该作者
gujiamao12345 发表于 2017-9-13 10:46
你们定的协议是什么样的

有个文档,专门介绍协议。但是上位机不判断 帧头。确切的说,是客户的上位机程序。
我们同事的上位机程序和客户的差不多

使用特权

评论回复
7
Cjy_JDxy|  楼主 | 2017-9-13 11:15 | 只看该作者
玄德 发表于 2017-9-13 10:50
用时间特征来分,这样的协议不好。

怎么用特征来分,能说的具体一点吗?

使用特权

评论回复
8
玄德| | 2017-9-13 11:27 | 只看该作者
Cjy_JDxy 发表于 2017-9-13 11:15
怎么用特征来分,能说的具体一点吗?


制定一个好的协议,然后根据协议解释。

我一般用这样的协议:帧头 + 有效字节数 + 内容,还可以加帧尾特征字符,
然后用“地毯式摸排”。说来话长了。




使用特权

评论回复
9
gujiamao12345| | 2017-9-13 11:50 | 只看该作者
Cjy_JDxy 发表于 2017-9-13 11:15
有个文档,专门介绍协议。但是上位机不判断 帧头。确切的说,是客户的上位机程序。
我们同事的上位机程序 ...

判断帧头比较好,你按时间收总归不太准确。
帧头+len+data+crc,一般这样的格式。

使用特权

评论回复
10
Cjy_JDxy|  楼主 | 2017-9-13 11:56 | 只看该作者
gujiamao12345 发表于 2017-9-13 11:50
判断帧头比较好,你按时间收总归不太准确。
帧头+len+data+crc,一般这样的格式。 ...

我下位机是按照这格式,可是上位机不是。

使用特权

评论回复
11
Cjy_JDxy|  楼主 | 2017-9-13 14:34 | 只看该作者
关于这个问题的解决办法,领导让我这么干(项目中用到UCOSII)。
OS_ENTER_CRITICAL();
        for(;num>0;num--)
        {
                USART_SendData(USART2, *s++);
                while( USART_GetFlagStatus(USART2,USART_FLAG_TC)!= SET);       
        }
        OS_EXIT_CRITICAL() ;

在发送数据的时候,加上关中断,发完再开中断。
我觉得这么干不靠谱。大家认为呢?

使用特权

评论回复
12
maiweiqi| | 2017-9-13 17:08 | 只看该作者
电脑接收com数据,经过了多层的转换,最后到上位机读取的时间不定的。有时候线程忙或电脑资源紧张,数据包就会延迟严重了。根据时间来定的话,怎么也不靠谱

使用特权

评论回复
13
mmuuss586| | 2017-9-13 19:39 | 只看该作者
最好定协议;

上位机我也写过,可以在一定时间内查询数据长度啊,然后读取多少数据,读完后将数据清楚;
至于你多读了一包数据,前面的数据还没清楚吧

使用特权

评论回复
14
icecut| | 2017-9-14 17:38 | 只看该作者

使用特权

评论回复
15
宇容创行| | 2017-9-14 17:42 | 只看该作者
串口数据本身就要一个一个处理,没有什么粘包的说法,只能是上位机写的太烂了。

使用特权

评论回复
16
gxs64| | 2017-9-14 19:29 | 只看该作者
这是上位机问题,估计是收了数据后没清com口。pc速度远高于单片机。

使用特权

评论回复
17
@若水| | 2017-9-15 09:00 | 只看该作者
我的做法是,在上位机软件中先开一个足够大的缓冲区,然后将串口接收到的数据放到缓冲区中,在另一个线程,在缓冲区中先查找帧头,然后再根据协议长度,读出整个数据包进行处理,我的协议帧格式为:帧头+datalen+data+帧尾,你也可也根据实际情况变通一下

使用特权

评论回复
18
山东电子小菜鸟| | 2017-9-15 18:08 | 只看该作者
你同事写的上位机得判断帧头帧尾哈

使用特权

评论回复
19
山东电子小菜鸟| | 2017-9-15 18:09 | 只看该作者
Cjy_JDxy 发表于 2017-9-13 11:15
有个文档,专门介绍协议。但是上位机不判断 帧头。确切的说,是客户的上位机程序。
我们同事的上位机程序 ...

通讯就没有不判断帧头的  USB TCP CAN 等等各种接口就没见过不判断帧头的

使用特权

评论回复
20
runningwzf| | 2017-9-15 23:04 | 只看该作者
Cjy_JDxy 发表于 2017-9-13 14:34
关于这个问题的解决办法,领导让我这么干(项目中用到UCOSII)。
OS_ENTER_CRITICAL();
        for(;num>0;num--) ...

长时间不响应中断会出问题的
你可以使用DMA

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:绿水本无忧因风皱面,青山原不老为雪白头。

553

主题

3530

帖子

19

粉丝