查看: 3872|回复: 37
收起左侧

[教程经验] 分享:数据处理—字位转换

Slimming 2022-5-25 16:55:45 | 显示全部楼层 |阅读模式
邀请回答

马上注册,享受更多特权

您需要 登录 才可以下载或查看,没有帐号?立即注册   

x
本帖最后由 Slimming 于 2022-5-25 21:25 编辑

在项目编程过程中,常常会遇到一些字位的转换问题,尤其是在设备之间通讯交互信号的时候,遇到连续批量的位需要合成字进行传输,或者读取到的字拆成位来用。

例如有80个bool数组变量需要通讯传输,因为每个bool变量占用1个字节,直接用字节进行通讯会占用80字节(40字)。所以将80个bool变量合成10个字节可以减少通讯任务量,降低cpu资源使用。

1字=2字节=16位,为方便阐述,以字节和位的转换来分析。

1.字节拆位

①下标引用
简单的字节拆位,可以直接使用下标.的形式来实现,例如iTemp.2代表变量的第2位,但是直接地址表示有个缺陷——数据无法批量处理
image.png

②与操作
如果要批量写几百个数组,那用直接地址就比较麻烦了,同类型数据或者数组的处理,在处理大量数据的时候尽可能用循环来做,
基于批量处理数据的问题,引入另一种方法,变量操作的 与(AND)或(OR)
与操作是主要用于两个数据以上的二进制操作,是用于同类型数据之间的同一个位的比较输出,即使是显示十进制数据,计算机内部均是二进制处理,在与操作时尽量用二进制来理解。
例如(2#1101 and 2#1010)结果是(2#1000),与操作后两个数据的位均是1结果才是1

基于这个理念,将第二个变量改为判断位对应的数据,再与第一个变量进行与操作,就可以把第一个变量中的位状态取出来。
例如变量a=2#1101,变量b作为判断变量,对两个变量与操作(a and b),
对变量b赋值 b=expt(2,0)=2#0001,(a and b)= 2#0001,取出变量a的第0位状态为1。
对变量b赋值 b=expt(2,1)=2#0010,(a and b)= 2#0000,取出变量a的第1位状态为0。

对变量b赋值 b=expt(2,2)=2#0100,(a and b)= 2#0100,取出变量a的第2位状态为1。
对变量b赋值 b=expt(2,3)=2#1000,(a and b)= 2#1000,取出变量a的第2位状态为1。


然后在for循环中,对b赋值b=expt(2,i),然后与操作(a and b)就可以把a中的第i位状态获取出来,即每一位的状态都可进行获取。
image.png
for循环来做三行代码即可,无论for还是while都可以,各个有适用的场合,在确定的数据量用for合适,不确定的数据量用while合适。

2.位合字


位合字的理念是与字拆位的理念是相反过程,把位的状态合起来,用每一位的十进制数逐渐相加求和得出位合成字的结果。
例如(2#0001 + 2#0010 + 2#0100 + 2#1000)= 2#1111
image.png
image.png


上面的方法适用于数组类型的bool变量,但如果变量是连续的结构体变量,不能使用[ ]进行变址,可以使用指针进行地址的偏移操作,实现效果是一样的,总之是怎么方便怎么来。
image.png image.png

在写好上面两个功能之后,就可以把程序封装留着备用,这个在有很多通讯数据要处理时方便的很,附上几张实际项目中使用的图片。
image.png image.png image.png image.png





点评

感谢分享,正需要!  发表于 2023-5-11 09:26
感谢分享  发表于 2022-5-26 08:10




上一篇:COEDSYS运动控制中文手册
下一篇:笔记

已有 0 人打赏作者

回复 邀请回答送花

使用道具 举报

zhou234 2022-5-26 07:51:34 | 显示全部楼层
感谢分享 image.png image.png image.png image.png image.png
回复 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册   

本版积分规则

有技术问题,就上汇川技术社区

INOVANCE汇川技术 公众号

扫码下载掌上汇川APP

全国服务热线:8:30-17:30

4000-300124

苏州地址:江苏省苏州市吴中区越溪友翔路16号

深圳地址:深圳市龙华新区观澜街道高新技术产业园汇川技术总部大厦

Copyright © 2003-2100 汇川技术 Powered by Discuz! X3.4 ( 苏ICP备12002088号 )
快速回复 返回列表 返回顶部