LabVIEWwilliam hill官网
直播中

荣琪

8年用户 689经验值
擅长:可编程逻辑 测量仪表 嵌入式技术
私信 关注
[文章]

荣小菜补钙记第43期:报文合成与解析之字的合成与分解

荣小菜补钙记第43期:报文合成与解析之字的合成与分解
同步更新于 WeChat:荣小菜在补钙
欢迎关注 内容更丰富
大家好,我是荣小菜,本期将分享一个能够快速合成和分解报文字(字节)的Vi,同时结合Demo,看看如何利用它高效的进行报文合成和解析。
1.     简介
在项目中我们总是要处理各种各样的报文,要根据预定格式进行一系列的报文合成和解析。报文合成指我们需要将代表不同含义的数据按格式组合成发送报文。而报文解析则指我们将收到报文按格式分解并得到对应的含义。可以看到,两者其实是数据操作两个方向,有不同但也有相通之处。
如何比较好的实现报文合成与解析,并具备一定的通用、复用能力呢,我们直接通过例子进行讲解。
假设报文格式如下图所示,整个报文包包含4个字,每个bit组合均代表不同的涵义。下面我们根据该报文格式进行报文合成和报文解析。
报文格式.JPG
                              
报文格式
2.     报文合成
首先是报文合成,根据报文格式,我们需要发送的报文除了包含固定的包头和包尾字,还要包含“年”、“月”、“日”、“功率”和“挡位”共5项信息。代码如下图所示,将控件数据通过”数据按起止位转有效值”Vi转化为有效值,之后按字合成并写入”报文字”自定义簇中,最后直接强制类型转即可得到要发送的报文。
报文合成前面板.JPG
报文合成前面板
报文合成后面板.JPG
报文合成后面板
3.     报文解析
再来看报文解析,假设刚才报文合成中的发送报文位我们要解析的报文,如何将其按报文格式解析分解成对应含义。代码如下,首先通过”从字符串还原”将收到的字符串报文解析成数值,随后将其中有效的字2和字3再次通过”数据按起止位转有效值”Vi转化为有效值,这样我们就解析得到了“年”、“月”、“日”、“功率”和“挡位”这5项信息。
报文解析前面板.JPG
报文解析前面板
报文解析后面板.JPG
报文解析后面板
4.     数据按起止位转有效值.vi
在本Demo中,不论是报文合成还是报文解析均依赖于”数据按起止位转有效值”Vi,该Vi的设计目的就是为了能够轻松的将不同位数的数据按规定的格式转换为对应值,以方便报文字(或字节)的合成(或分解)。
选择左移,可以将报文转换成有效值合成;选择右移动,可以将报文直接分解为有效值。其代码如下图所示。
先看左移代码,首先根据起止位相差的位数提取输入数据的有效值(如起1止3,则结果为0x111 & 输入数据),之后根据起始位将有效值逻辑移位。这样我们就将输入数据根据报文格式(起止位)转换为了报文中的实际值。
左移.JPG
数据按起止位转有效值_左移
再看右移,与左移过程相反,首先要先根据起始位将输入数据进行逻辑右移(起始位取负),之后再根据起止位提取有效值(该部分类似左移)。这样就从输入数据中根据报文格式(起止位)提取出了目标值。
右移.JPG
数据按起止位转有效值_右移
5.     总结
本期分享的”数据按起止位转有效值”Vi可以大大减轻我们平常繁琐的字(字节)合成和解析工作。通过Demo演示可以看出该Vi也具备一定的通用、复用特性。
需要注意的是,Demo中我们的报文合成/分解能够十分顺利的基本保证是数据结构的正确选择。从控件设计到代码逻辑,整个过程我们始终以保持报文为数值类型为目标,并使用“自定义数值簇”进行管理,也因此我们才可以使用“强制类型转换”、“从字符串还原”等函数来快速完成数值与字符串报文的互转。很多新手在处理报文时逮着字符串一顿处理,最后还转成布尔数组按位疯狂切割,主要就是忽略了报文就是U8U16数值的本质,导致最后做了很多无用功。
分享开源免费,共同学习进步^_^
源代码:
DemoProj2016.rar (138.08 KB)
(下载次数: 67, 2021-8-26 20:32 上传)

回帖(2)

张艺潇

2021-8-27 09:26:52
挺好的资料,谢谢分享了     
举报

MTB

2022-1-20 13:10:55
谢谢分享,学习下
举报

更多回帖

发帖
×
20
完善资料,
赚取积分