如何在Uthon中将通过UART发送的字符串转换为整数?

时间:2016-06-28 04:04:55

标签: python utf-8 avr avr-gcc

我很难将通过UART接收的字符串转换为十进制版本。我用port.read(1)读取一个字节然后打印

print "%s: %s" % ( time.ctime(time.time()), str)

这将打印出与ascii character的十进制值匹配的预期字符。我发送已知值在0到100之间。我的问题是我无法将其转换为十进制值并打印出来而不是说' *'对于42.我非常确定默认的编码/解码是正确的,因为C中的整数值在python中接收时显示正确的字符。

也许有助于提到发送器是用avr-gcc编程的AVR微控制器。我已解决了解码(' utf8'),解码(" ISO-8859-1")和解码(" ISO-8859-2&#34) ;)但我再次确定这不是我想要的。我也尝试使用int()函数将读取值转换为小数,但没有运气。我明白了。

ValueError: invalid literal for int() with base 10: '\xe4'

1 个答案:

答案 0 :(得分:0)

python工作得很好,这是你的avr代码坏了。

记住你发送的是一个值为0到100的字节, 然后在python端你将这个字节视为一个字符串,但字符是通过ascii或unicode字符映射映射的,所以你得到一些字符,但不是必需的整数:

 In [1]> chr(48)
 Out[1]> '0'

因此,您可以更改avr上的代码,因此它将发送一到三个字节而不是一个字节,例如。 ' 100'将包含三个字节:

'\x31\x30\x30' 
# 49 48 48 - in decimal

你将在python端转换数据:

value = port.read(1)  # reading one byte
int_value = ord(value)

# or using struct module - there you can decode multiple values in one go
import struct

int_value = struct.unpack('B', value)[0]  # struct always is returning tuple