ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
查看: 640|回复: 22
收起左侧

[STM32F1] 粘包的问题

[复制链接]
     

56

主题

305

帖子

916

积分

高级技术员

 楼主| 发表于 2017-9-13 10:10 | 显示全部楼层 |返回版面|阅读模式
我写 串口数据收发处理程序,和其他同事写的上位机通讯。
经常发生粘包的问题,就是有时候一包数据发送的时候,中间
时间慢了一点,对方接收就会认为两包,从而导致校验和或者
帧头错误。可是串口调试助手试,没发现粘包,一帧数据都是
连在一起发送的。请问高手,如何解决?谢谢!
绿水本无忧因风皱面,青山原不老为雪白头。

6

主题

789

帖子

2423

积分

初级工程师

发表于 2017-9-13 10:42 | 显示全部楼层 |返回版面
之前做上位机的同事说,PC端串口控件是定时上报接收数据的。
具体的记不清,但原理我理解为,不论什么时间点发数据,控件每隔100ms(假设值)上报接收数据到缓冲区。
这样如果在99ms的时候开始发数据,共10ms发完,那么无论中间时间多快,数据包都是会被拆分成两包的。
     

10

主题

366

帖子

1163

积分

助理工程师

发表于 2017-9-13 10:46 | 显示全部楼层 |返回版面
你们定的协议是什么样的
     

119

主题

4729

帖子

1万

积分

资深工程师

发表于 2017-9-13 10:50 | 显示全部楼层 |返回版面

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


有事请找 xuander
     

56

主题

305

帖子

916

积分

高级技术员

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

谢谢
绿水本无忧因风皱面,青山原不老为雪白头。
     

56

主题

305

帖子

916

积分

高级技术员

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

有个文档,专门介绍协议。但是上位机不判断 帧头。确切的说,是客户的上位机程序。
我们同事的上位机程序和客户的差不多
绿水本无忧因风皱面,青山原不老为雪白头。
     

56

主题

305

帖子

916

积分

高级技术员

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

怎么用特征来分,能说的具体一点吗?
绿水本无忧因风皱面,青山原不老为雪白头。
     

119

主题

4729

帖子

1万

积分

资深工程师

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


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

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




有事请找 xuander
     

10

主题

366

帖子

1163

积分

助理工程师

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

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

56

主题

305

帖子

916

积分

高级技术员

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

我下位机是按照这格式,可是上位机不是。
绿水本无忧因风皱面,青山原不老为雪白头。
     

56

主题

305

帖子

916

积分

高级技术员

 楼主| 发表于 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() ;

在发送数据的时候,加上关中断,发完再开中断。
我觉得这么干不靠谱。大家认为呢?
绿水本无忧因风皱面,青山原不老为雪白头。

4

主题

85

帖子

258

积分

中级技术员

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

463

主题

2万

帖子

7万

积分

版主

发表于 2017-9-13 19:39 | 显示全部楼层 |返回版面
最好定协议;

上位机我也写过,可以在一定时间内查询数据长度啊,然后读取多少数据,读完后将数据清楚;
至于你多读了一包数据,前面的数据还没清楚吧
ST、机器人、电路欣赏等版主;感谢大家的支持;

电子工程师群1:16519783;123768874;171897584;
物联网群:301879792;智能机器人群:284122983; AGV及立体仓库群:309252026;
     

1084

主题

1万

帖子

4万

积分

版主

发表于 2017-9-14 17:38 | 显示全部楼层 |返回版面
     

12

主题

865

帖子

2633

积分

初级工程师

发表于 2017-9-14 17:42 | 显示全部楼层 |返回版面
串口数据本身就要一个一个处理,没有什么粘包的说法,只能是上位机写的太烂了。
     

167

主题

2184

帖子

1万

积分

资深工程师

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

19

主题

1257

帖子

3786

积分

中级工程师

发表于 2017-9-15 09:00 | 显示全部楼层 |返回版面
我的做法是,在上位机软件中先开一个足够大的缓冲区,然后将串口接收到的数据放到缓冲区中,在另一个线程,在缓冲区中先查找帧头,然后再根据协议长度,读出整个数据包进行处理,我的协议帧格式为:帧头+datalen+data+帧尾,你也可也根据实际情况变通一下
专注于以太网  GPRS GSM CAN 485 继电器等工控模块
小店:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-6466605198.19.7OO7ja&id=522606430970
回头之人,永远无法见到真相
      

53

主题

1252

帖子

4335

积分

版主

发表于 2017-9-15 18:08 | 显示全部楼层 |返回版面
你同事写的上位机得判断帧头帧尾哈
qq:641208111;技术交流群:377640799
欢迎去大赛专区交流:点我进入()
欢迎加个人QQ:641208111一起交流合作
      

53

主题

1252

帖子

4335

积分

版主

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

通讯就没有不判断帧头的  USB TCP CAN 等等各种接口就没见过不判断帧头的
qq:641208111;技术交流群:377640799
欢迎去大赛专区交流:点我进入()
欢迎加个人QQ:641208111一起交流合作

4

主题

665

帖子

2233

积分

初级工程师

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

长时间不响应中断会出问题的
你可以使用DMA
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

分享 快速回复 返回顶部 返回列表