当前位置:  开发笔记 > 编程语言 > 正文

我可以将2字节大小的变量作为1字节大小的变量发送吗?

如何解决《我可以将2字节大小的变量作为1字节大小的变量发送吗?》经验,为你挑选了1个好方法。

我正在进行一些ADC(模数转换)值转换,需要通过UART发送这些值,但由于速度和其他大小限制,我想将它们转换为一个字节大小

ADC为12位,范围为0.0到5.0.

目前我正在将2字节变量拆分为两个单独的字节,并将它们连接回接收器部分

发送(C)

// i am trying to send 0xFF8 (4088) which is read from that register 
send[0] = (VADC_G5RES4.B.RESULT) >> 8 ;
send[1] = (VADC_G5RES4.B.RESULT) & 0x0FF;
 .
send[30] = .....

接收(Python)

adc1 = data[3]
adc1 = adc1 << 8 | data[4]
adc1 = (float(adc1 * 5) / 4096)
# gives me 4.990234 as the value 

有什么方法可以只用一个字节发送值(可能通过在发送端执行计算)

小数点后只有2位数(4.99)可以



1> user2357112 ..:

如果有一些神奇的方法可以将双字节值填充到一个字节的值中,我们会对所有内容执行此操作,然后我们会再次执行此操作,并且我们将继续执行此操作并将所有内容的大小减半,直到我们推迟将所有世界的信息转换成单个字节.这种魔力是不可能的.

如果你丢弃一半的数据,你可以减少事物的大小,但你说你想要小数点后至少2位数.一个字节只能编码256个不同的值,编码从0.00到9.99的所有值都需要1000个不同的值,因此您仍然无法执行此操作.


更新:有了额外的信息,这些只是12位值,而不是16位,最大值是5.0,我们可以做得更好,但仍然不是8位中的3位有效数字.

首先,我们可以将2个值打包成3个字节,而不是每个值浪费4位.那看起来像

def pack(val1, val2):
    byte1 = val1 >> 4
    byte2 = ((val1 & 0xf) << 4) | (val2 >> 8)
    byte3 = val2 & 0xff
    return byte1, byte2, byte3

您可能需要处理尾随的半字节.

如果每个值1.5个字节仍然太多,则存在有损编码选项.例如,我们可以丢弃每个值的4个最低有效位:

encoded = val >> 4

并适当解码:

decoded = encoded * 5.0 / 256

这保持精度为5/256,或约0.02.其他编码可能会表现得更好,具体取决于您对信号的期望.例如,chux的解决方案只要值不会变化太快就对值进行编码,但是当值快速变化时,只有大约0.04的精度.


Hahahahahhaahahahah!+1.我希望我能+更多.
推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有