原创 写协议解析程序的过程(关于通信解析函数的理解)

2013-5-23 17:10 1710 15 17 分类: 消费电子

 

以前需要写一个协议的解析程序。开始没有感觉会有多麻烦,感觉就是按照协议说的一步步走下去就行了。在写的过程中,慢慢发现没有自己想的那么简单。由于以前没有写过这方面的程序,在一开始就陷入了误区。对于上行数据,与下行数据的解析的描述,自己就搞错了。一直看着下行数据的描述,去想上行数据的代码怎么从数据中提取出来。开始忙了一周,程序还是很混沌。

 

第二周在将协议看了看,又问了问同事,才闹明白了自己所操作的主要接收下行数据,所以主要负责对下行数据的解析。知道上边发下的命令后,在组织一段上行数据发出去。如此就是一个解析程序。如此一个循环,即解析了下行数据。之后自己总结了当时理解的:

 

什么是协议解析?

 

将发送方发过来的数据,依照协议的要求规则进行数据的翻译,找出发送方要求接收方实现的动作,接收方将动作完成(给发送方回复它需要的数据,ACK或相应的数据记录)。

 

当时没有考虑,一个节点可能即要解析下行数据,又要解析上行数据。这样自己最早写的代码,就不能用了。因为它主要解析下行协议,对于接收的上行协议,没有解析。因为当时没有想到要接收上行数据,认为就是一个终端了。

 

现在在想如果这个节点只是通信中的一个既要负责接收下行数据,又要对别的节点发过来的上行数据做出反应,那样的协议解析程序,才算是比较完整的。

 

现在自己理解的一个协议的解析程序是这样组织:

 

1、发出数据的打包:

 

首先组织一个数据帧,打包函数将此帧依照协议的帧结构,将其解析到一个数组中,计算出长度,将其发送出去。

 

2、接收数据的解析:

 

有数据接受时,首先判断此数据是否为正确的帧(符合协议要求的校验规则),之后解析出功能码(或者到数据标识),在功能码解析函数中,依据协议的上下行标志,调用相应的代码进行数据解析。(这样即可以解析下行数据,也可以解析上行数据,构成一个完好的正解析模块)

 

补充 :在解析接收过来的数据时,首先判断一下长度,对于长度不符合的可以跳出。有时候如果不判断这个,可能造成以后在判断时出现错误。

 

如何写协议解析程序:

 

读协议时,首先分析整个帧的结构,了解帧有几部分组成,各个标识是什么,含义什么。例如:长度,控制字,等一些关键信息的分析。

 

之后,了解它们具有的功能项,根据功能项的描述找到可能用到的功能项,并具体分析这些功能项的结构,与字节代表的意义。
到这里可以确定,帧的结构,使用到的功能项,并且已经有所了解。
 
然后根据帧结构,构建帧的打包与解析函数的框架,根据具体功能项,细化解析函数。
 
确定好框架后,开始编码,根据功能项的字节定义读取出帧数据中的信息,但是对于这些信息的处理,交由传入的函数处理,因为对于这些信息的处理可能会有不同,交由外部实现,一来简化协议内部的编码,二来增加协议解析处理的灵活性。
 

当然这些只是自己的理解。

文章评论2条评论)

登录后参与讨论

1989tie_959541171 2013-5-24 23:36

是啊,有些事情,做了才知道深浅,反思了会找到最初的疑惑。

用户1602177 2013-5-23 17:18

看事容易,做事难~~不真正不尝试过就不能理解啊~~
相关推荐阅读
catch2000 2015-07-19 11:44
信号线小电阻的作用
在一块新的PCB上,测试系统能否正常运行的时候,发现系统上电后没有正常启动。  系统框图如下:   在上电的时刻,CPU A(GPIO电平2.6V)会向串口发送启动日志数据,CPU A启动后,...
catch2000 2015-07-05 17:04
协议设计中ACK机制的影响
在TCP/IP中,延时ACK和Nagle算法。  TCP为了同时处理成块数据(通常为512字节的用户数据)和交互数据(通常用户数据比较少,例如不大于10个字节),采用了延时ACK和Nagle算法...
catch2000 2015-05-23 15:48
话说物联网操作系统
最近好多家都宣布推出自己的物联网操作系统。   1. Google将要在Google I/O大会发布的Brillo; 2. 三星推出的Artik芯片搭载Mentor Graphics的...
catch2000 2015-03-31 23:52
不要采用异或来交换两个变量
在进行两个变量的时候,经常会看到有些书误人子弟的推荐使用异或的方式: 方式一 {   x = x ^ y;   y = x ^ y;   x = x ^ y; } 而不是...
catch2000 2014-10-09 07:28
为什么要测试先行
在产品的研发过程中,测试一项至关重要。不论是软件还是硬件。   软件的测试先行,在研发过程中,就做到质量的保证,因为在出现Bug的时候,容易定位Bug,而且即使是在客户端出现Bug,也能够...
catch2000 2014-10-09 07:26
C语言的面向对象编程(一)
一、前言 对于编程而言,重要的是解决问题的方式,而不是语言本身。面向对象与面向过程是解决问题和思考问题的方式。C语言常说是面向过程开发的语言,因为其缺少很多对于面向对象特性的支持。但,这并不影...
我要评论
2
15
关闭 站长推荐上一条 /2 下一条