打印

高手 来解答,相信群众的力量

[复制链接]
2154|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yesiqi|  楼主 | 2013-3-10 10:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟最近在做一个通讯协议,单片机串口处理的,由于数据量大,信息量丰富,只能不断的if去判断,过于冗余,所以想请教大家,关于大量通讯数据的组帧和解帧有没有相关的算法,相关的书,我想学习…………
例如:0A LL XX XX 0B LL XX XX 0C LL XX XX 0D LL XX XX 这样的数据,其中0A 0B 0C 0D都是相关信息的标识,LL表示长度,长度不定, 相关信息有些可省略,另外这只是应用层的数据,物理层我已经处理完毕,请大家支招,当然数据量远远比这要大

相关帖子

沙发
cpu51| | 2013-3-10 10:46 | 只看该作者
你用MODBUS协议。

使用特权

评论回复
板凳
yesiqi|  楼主 | 2013-3-10 11:09 | 只看该作者
cpu51 发表于 2013-3-10 10:46
你用MODBUS协议。

我的协议定了,这个协议太简单了,我的问题是软件 怎么去处理各个数据,有没有算法,不是用哪个协议的问题

使用特权

评论回复
地板
refee| | 2013-3-10 11:26 | 只看该作者
楼主可以贴段代码让大伙瞧瞧先……

使用特权

评论回复
5
dirtwillfly| | 2013-3-10 13:28 | 只看该作者
同意楼上的建议。

使用特权

评论回复
6
飞鹰嵌入式| | 2013-3-10 14:45 | 只看该作者
首先分析协议特点,1、每条协议长度是否一致,如果一致就好做了
                  2、每条协议是否有开头和结尾,
总之是要总结分析协议特点,根据其特点进行解析
应用层你关注一下这个函数strtok,是个库函数

使用特权

评论回复
7
mcu5i51| | 2013-3-10 15:19 | 只看该作者
如果每一个数据段的处理方式相同的话,可以用接受的缓冲区地址作为指针传递到一个处理函数,根据数据长度计算下一个数据段位置做后续处理。
如果不同的处理方式,可以编写多个相应的处理函数,使用函数指针的方式根据功能号调用相应的函数处理,后续处理同上

使用特权

评论回复
8
rockli| | 2013-3-10 20:39 | 只看该作者
处理通讯协议帧头帧尾的万能方法就是 --  状态机----

使用特权

评论回复
9
xg3469| | 2013-3-10 21:50 | 只看该作者
状态机,战斗机?有道理,受启发了。

使用特权

评论回复
10
jerkoh| | 2013-3-10 22:42 | 只看该作者
1.串口接收带帧隔间的(大于3倍的一字节接收时间),利用定时器就可以溢出分析处理整包

2.串口不要命的连续给单片机发数据的,利用0x10 0x02 =STX   0x10 0x03=ETX    IDLE=10  就可以解决
                                    或者这种:地址拆分0x0X  长度拆分0x2X 命令数据和CRC拆成0x3x 结束符固定0xFF (效率换正确率)
                                    中断状态机分析写入一个二维MAX FIFO组,完了告诉任务就可以处理了

3.楼主这种没头没尾的,连状态机都难搞   LL里面可能带0A吧,XX里面也可能带0B吧 一旦串口中断接收buffer溢出返回头部 或者分析不及时,XX里的OB当成了命令OB,再加还没有CRC的话 那麻烦了   

  如果不存在3的问题  命令和长度和数据都是唯一区分的.那按二维MAX FIFO组 将数据填充进去再单整包分析的话 也是非常实时,浪费些内存,效率还是很高的

  思路如下 写一个结构体, 包含状态、命令,长度 和一个MAX buf, 再定义一个二维数据,最大处理几个包,每个包里的极限数据量长度是多少。
  串口收到数据,中断里面就判断2个类型,查空位组,对其只管不断拼独立包  独立一个一个的在二维数据里面排列好了 。
  然后后台检测这个二维数组是否有新的包被登记了,结构体指向,利用switch  去处理结构实体里面的 cmd 和 data就是了,处理掉就释放出空位

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
SLEET1986 + 2 很给力!
11
DownCloud| | 2013-3-11 00:38 | 只看该作者
学习了下回复的。
怎么写代码而已。

使用特权

评论回复
12
jlass| | 2013-3-11 08:40 | 只看该作者
确如10楼所说,应该增加包头的设定,不然什么算法都解不出来

使用特权

评论回复
13
yesiqi|  楼主 | 2013-3-11 09:48 | 只看该作者
飞鹰嵌入式 发表于 2013-3-10 14:45
首先分析协议特点,1、每条协议长度是否一致,如果一致就好做了
                  2、每条协议是否有开头 ...

第一个问题:长度肯定不一致了,我说了里面有些数据如果没有该功能是可缺省的,所以每一次通讯的数据长度不定。
   第二个问题:说明一下,我的协议肯定是有帧头和帧尾且带CRC校验的,这些都在物理层已经处理到了,如果CRC校验出错,应用层是不会收到数据的,我上面发的都是物理层处理好交给应用层的数据,当然是脱去了物理层的数据(包括帧头,目标地址,源地址,帧序列号,控制数据,CRC校验,帧尾),到应用层的都是应用层要处理的数据。
   第三、四个问题:只能叹气了!!!

使用特权

评论回复
14
yesiqi|  楼主 | 2013-3-11 09:51 | 只看该作者
mcu5i51 发表于 2013-3-10 15:19
如果每一个数据段的处理方式相同的话,可以用接受的缓冲区地址作为指针传递到一个处理函数,根据数据长度计 ...

目前 就是这样的处理方式 ,先if判断标识,然后把长度当形参传递过去 ,处理完置相应标志(因前后数据有逻辑关系),但这样if太多,所以想有没有好的算法

使用特权

评论回复
15
yesiqi|  楼主 | 2013-3-11 09:51 | 只看该作者
rockli 发表于 2013-3-10 20:39
处理通讯协议帧头帧尾的万能方法就是 --  状态机----

我上一楼已经回复

使用特权

评论回复
16
yesiqi|  楼主 | 2013-3-11 10:43 | 只看该作者
jerkoh 发表于 2013-3-10 22:42
1.串口接收带帧隔间的(大于3倍的一字节接收时间),利用定时器就可以溢出分析处理整包

2.串口不要命的连 ...

回复一下,1、我的本来就是一整包,而且是把物理层数据去了,详细看上面我的回复 。
2、这个没有懂,肯定不是不要命的发,必须是交互的。呵呵呵
3、这个不是问题啊,0A后面有长度LL,LL以内的肯定都是0A的数据,不会处理错的。
看到后面,好像有了点想法,再想想,谢谢了啊

使用特权

评论回复
17
microxh| | 2013-3-11 10:50 | 只看该作者
实际就是如何编码和解码的问题, 高清数据结构定义, 设计自定义函数, 此类问题都适用啦

使用特权

评论回复
18
lzqxs89| | 2013-3-11 14:27 | 只看该作者
我是来学习的

使用特权

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

本版积分规则

个人签名:就侃单片机 技术博客http://blog.sina.com.cn/u/1681173590

2

主题

60

帖子

0

粉丝