我正在进行一些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)可以
如果有一些神奇的方法可以将双字节值填充到一个字节的值中,我们会对所有内容执行此操作,然后我们会再次执行此操作,并且我们将继续执行此操作并将所有内容的大小减半,直到我们推迟将所有世界的信息转换成单个字节.这种魔力是不可能的.
如果你丢弃一半的数据,你可以减少事物的大小,但你说你想要小数点后至少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的精度.