打印

求思路,串口接收不固定数据长度包,可以怎么处理

[复制链接]
7174|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liujie14565|  楼主 | 2013-9-17 21:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假如数据包没有  帧尾 标志 的 状态下    可以怎么判断 一帧数据包要完全接收完了 然后在进行进行处理

查阅网上资料有实现的方法就是用定时器来判断数据间隔来实现,但这种方法却占用了一个硬件定时器.....

特来询问还有什么好方法实现吗??? 当然MCU 无DMA ...

相关帖子

沙发
ningling_21| | 2013-9-17 21:52 | 只看该作者
长度不固定,总长度总知道吧,可以根据长度判断帧结束...

使用特权

评论回复
板凳
liujie14565|  楼主 | 2013-9-17 22:54 | 只看该作者
ningling_21 发表于 2013-9-17 21:52
长度不固定,总长度总知道吧,可以根据长度判断帧结束...

一帧数据长度不固定   何来 总长度 ?????

使用特权

评论回复
地板
chunyang| | 2013-9-17 23:34 | 只看该作者
延时判断,如果一个字节传输时间以上的时间内还未有新的数据到来则可以认为是数据传输已结束。

使用特权

评论回复
5
ayb_ice| | 2013-9-18 07:50 | 只看该作者
可以利用包间的间隙来识别,比如中间至少100MS

使用特权

评论回复
6
qzc13457| | 2013-9-18 08:00 | 只看该作者
我是先封装数据,格式为  数据头+数据长度+数据+校验码  然后接收完长度后提取出来,按此长度接收数据,如果需要可以给你代码

使用特权

评论回复
7
原野之狼| | 2013-9-18 08:54 | 只看该作者
modbus协议里就有通过时间间隔来判断帧结束的 查看一下对应文档吧

使用特权

评论回复
8
reayfei| | 2013-9-18 08:55 | 只看该作者
chunyang 发表于 2013-9-17 23:34
延时判断,如果一个字节传输时间以上的时间内还未有新的数据到来则可以认为是数据传输已结束。 ...

这个方法确实好用:handshake

使用特权

评论回复
9
ningling_21| | 2013-9-18 11:44 | 只看该作者
ningling_21 发表于 2013-9-17 21:52
长度不固定,总长度总知道吧,可以根据长度判断帧结束...

曾遇到一个协议,包长是不固定的,但长度存在于第一和第二字节,这样长度就知道了...

使用特权

评论回复
10
sunhq02| | 2013-9-18 13:55 | 只看该作者
思路一, 最好能够对这个数据协议进行优化
a.在数据包末尾增加 结束标志和校验码
b.在数据包头部增加 包长, 尾部增加校验码

思路二, 给串口缓冲模块增加计时功能
每次接收到新数据时, 清零串口缓冲计时器
每若干ms时, 计时器加1
若计时器达到特定值, 表明已经一定时间没有新数据了
则认为一帧结束
(这个计时器可以和系统节拍挂钩)

使用特权

评论回复
11
Zacking| | 2014-12-5 16:30 | 只看该作者
chunyang 发表于 2013-9-17 23:34
延时判断,如果一个字节传输时间以上的时间内还未有新的数据到来则可以认为是数据传输已结束。 ...

請問版主,一般如何打包數據包發送時,如何处理检验位啊?我想通过一个实现异或功能的函数返回检验位,但这里不知道要怎么来使用定义那个校验函数。这是我写的数据包代码
case 0x01:{
USART_SendData(USART2,0x5A);
USART_SendData(USART2,0x01);
USART_SendData(USART2,0x03);
USART_SendData(USART2,RegBuff[0]);
USART_SendData(USART2,RegBuff[1]);
USART_SendData(USART2,RegBuff[2]);
USART_SendData(USART2,0x5A^0x01^0x03^RegBuff[0]^RegBuff[1]^RegBuff[2]);//这里为数据包校验位,感觉太麻烦,想用异或函数
USART_SendData(USART2,0xFF);

case 0x02:{
USART_SendData(USART2,0x5A);
USART_SendData(USART2,0x02);
USART_SendData(USART2,0x03);
USART_SendData(USART2,RegBuff[3]);
USART_SendData(USART2,RegBuff[4]);
USART_SendData(USART2,RegBuff[5]);
USART_SendData(USART2,0x5A^0x02^0x03^RegBuff[3]^RegBuff41]^RegBuff[5]);//这里为数据包校验位,感觉太麻烦,想用异或函数
USART_SendData(USART2,0xFF);

请版主指教

使用特权

评论回复
12
chunyang| | 2014-12-5 22:20 | 只看该作者
Zacking 发表于 2014-12-5 16:30
請問版主,一般如何打包數據包發送時,如何处理检验位啊?我想通过一个实现异或功能的函数返回检验位,但 ...

最好用CRC校验,不用什么校验位。有关CRC校验的编程方法可以在本栏目里找我多年前发的老帖,协议则可借鉴ModBus,协议规范我同样发过。

使用特权

评论回复
13
Zacking| | 2014-12-8 10:05 | 只看该作者
chunyang 发表于 2014-12-5 22:20
最好用CRC校验,不用什么校验位。有关CRC校验的编程方法可以在本栏目里找我多年前发的老帖,协议则可借鉴 ...

好的,謝謝!

使用特权

评论回复
14
coody| | 2014-12-8 10:46 | 只看该作者
字符同步,或超时

使用特权

评论回复
15
xytjj| | 2017-5-17 10:23 | 只看该作者

使用特权

评论回复
16
dun20062006| | 2017-5-18 15:33 | 只看该作者
加一个定时器,收到1个字节进行计时, 下个字节重新计时, 计时器超时(5ms没有收到数据)则认为接受完成,进入命令处理

使用特权

评论回复
17
ateganyl| | 2017-11-7 14:59 | 只看该作者
dun20062006 发表于 2017-5-18 15:33
加一个定时器,收到1个字节进行计时, 下个字节重新计时, 计时器超时(5ms没有收到数据)则认为接受完成, ...

怎么判断串口是否有接收到数据呢?

使用特权

评论回复
18
5574293| | 2018-1-19 10:10 | 只看该作者
qzc13457 发表于 2013-9-18 08:00
我是先封装数据,格式为  数据头+数据长度+数据+校验码  然后接收完长度后提取出来,按此长度接收数据,如 ...

不知道过了这么久,那个代码还在吗?

使用特权

评论回复
19
憨厚诚实大叔| | 2018-1-19 14:00 | 只看该作者
5574293 发表于 2018-1-19 10:10
不知道过了这么久,那个代码还在吗?

用空闲中断,不知道你用的MCU有没有这个中断

使用特权

评论回复
20
5574293| | 2018-1-19 15:40 | 只看该作者
憨厚诚实大叔 发表于 2018-1-19 14:00
用空闲中断,不知道你用的MCU有没有这个中断

我的目的是,从一个帧里面筛选出来我需要的数据。但是没有帧头帧尾。Modbus数据筛选。不管在标准数据前面加多少数据,都可以识别出来。

使用特权

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

本版积分规则

19

主题

195

帖子

2

粉丝