[STM32F1]

粘包的问题

[复制链接]
2581|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 | 显示全部楼层

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


使用特权

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

谢谢

使用特权

评论回复
Cjy_JDxy|  楼主 | 2017-9-13 11:15 | 显示全部楼层
gujiamao12345 发表于 2017-9-13 10:46
你们定的协议是什么样的

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

使用特权

评论回复
Cjy_JDxy|  楼主 | 2017-9-13 11:15 | 显示全部楼层
玄德 发表于 2017-9-13 10:50
用时间特征来分,这样的协议不好。

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

使用特权

评论回复
玄德| | 2017-9-13 11:27 | 显示全部楼层
Cjy_JDxy 发表于 2017-9-13 11:15
怎么用特征来分,能说的具体一点吗?


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

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




使用特权

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

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

使用特权

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

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

使用特权

评论回复
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() ;

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

使用特权

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

使用特权

评论回复
mmuuss586| | 2017-9-13 19:39 | 显示全部楼层
最好定协议;

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

使用特权

评论回复
icecut| | 2017-9-14 17:38 | 显示全部楼层

使用特权

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

使用特权

评论回复
gxs64| | 2017-9-14 19:29 | 显示全部楼层
这是上位机问题,估计是收了数据后没清com口。pc速度远高于单片机。

使用特权

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

使用特权

评论回复
你同事写的上位机得判断帧头帧尾哈

使用特权

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

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

使用特权

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

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

使用特权

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

本版积分规则

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

553

主题

3520

帖子

19

粉丝