合信论坛

快捷导航
查看: 6040|回复: 0

将通讯ASCII数据格式不固定情况下筛选提取成浮点数方法。

[复制链接]

8

主题

8

帖子

567

积分

高级会员

Rank: 4

积分
567
发表于 2021-1-31 13:41:39 | 显示全部楼层 |阅读模式
本帖最后由 liuweidong 于 2021-1-31 15:06 编辑

我们在进行例如SOCKET数据或串口的自由口通讯时,通常接收到数据格式为ASCII码的格式,这时我们需要将ASCII码转换提取成需要的数据类型。例如:
微信截图_20210131133911.png
这时接收到的两组数据分别为123.45和6.7,其中';'将两组数据划分,标志符'E'为结束字符,这些是由发送数据格式确定的。但是例如在跟相机等视觉系统通讯时,数据的长度可能每次不一样,比如拍照接收的是小数点前三位加后三位的浮点数,下一次拍照接受的为小数点前两为加小数点后两位的浮点数,这是需要有一个算法可以解决数据长度不固定的情况下也可以转换。
方法一:数据格式固定为小数点前三位加后三位的格式
还以上图数据为例,可以先将ASCII码转为十进制显示数后,利用1*1000+2*100+3*10+4*0.1+5*0.01得到浮点数123.45来使用,这样算法固定简单明了。

方法二:数据格式为不固定固定
第一步:首先我们需要将接收到ASCII码数据转换成十进制的ASCII吗显示值。
微信图片_20210131133023.jpg
通过表格我们可以发现ASCII数值和十进制之前相差48,因此我们可以用接收到的数据减去48得到了十进制的ASCII码显示值。
微信截图_20210131133919.png

第二步:通过指针寻址实现地址偏移,从需要转换的数据首地址开始,每运算一次后指向下一个地址再次进行运算,一直运算到结束字符(如无结束字符可根据接收字符长度计算)。
具体指针使用方法之前有帖子写过可以再次学习一下。

第三步:具体运算方法
设定     X初始值为0    Y初始值为1
X每次乘10加上指针指向地址的数值,Y在检测指针寻址检测到小数点开始乘10.
举例:
微信截图_20210131142318.png
VB10003   vb10008 为小数点的十进制减48得到的,vb0010为结束字符'E'得到的 。vb10006为';'
指针从vb10000为首地址,当指到vb10003是Y开始运算,指到vb10006时知道一个数据结束了,这是X的值为12345,Y的值为100,这是X除以Y得到我们需要的浮点数数据123.45.
同理可以运算出下组数据为6.7。指针发现当前值指到结束字符后指针停止向下一个地址偏移。

这个方法可以有效的解决数据长度不管固不固定情况下都能有效提取出浮点数。






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

本版积分规则

客服热线
400-700-4858 周一至周五:09:00 - 18:00
深圳市南山区打石一路深圳国际创新谷6栋A座9层

深圳市合信自动化技术有限公司(简称“合信技术”)成立于2003年,高新技术企业,专注于工业自动化产品的研发、生产、销售和技术服务,依靠高质量、高性能的自动化控制产品与方案为客户创造最大价值,立志于成为全球领先的工业自动化解决方案供应商。

Archiver|手机版|小黑屋|COTRUST Inc. ( 粤ICP备13051915号 )

GMT+8, 2024-4-20 10:20 , Processed in 0.072952 second(s), 23 queries .

快速回复 返回顶部 返回列表