【问题标题】:How can I convert a string sent over UART to integer in python?python - 如何将通过UART发送的字符串转换为python中的整数?
【发布时间】:2016-06-28 04:04:55
【问题描述】:

我在将通过 UART 接收的字符串转换为十进制版本时遇到了困难。我用port.read(1) 读入一个字节然后打印出来

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

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

提到发送器是一个用 avr-gcc 编程的 AVR 微控制器也可能会有所帮助。我已经搞砸了 decode('utf8')、decode("ISO-8859-1") 和 decode("ISO-8859-2") 但我很确定这不是我想要的。我还尝试使用 int() 函数将读取的值转换为小数,但没有成功。我明白了。

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

【问题讨论】:

  • 您在寻找ord(your_character)吗? ord("*")42。如果您需要解码多个字节,我会使用struct.unpack

标签: python utf-8 avr avr-gcc


【解决方案1】:

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

【讨论】:

  • 啊。看到我也在尝试 struct.unpack 但它给了我它无法打印元组的错误。我不知道如何处理它,但看起来如果我只是抓住第一个能给我想要的价值的成员。明天下班后我得试一试。感谢您的回复。
  • @wuttadowner 欢迎您,如果这回答了您的问题 - 将其标记为解决方案,谢谢。
  • 我现在让它打印整数,但我想知道我是否以最好的方式做到这一点,而且我也不理解程序的输出。 avr 微控制器获得已知值非常重要,因为我使用它来设置 pwm 速度。我想要一个介于 0 和 100 之间的值。这是我认为我从 python 发送的,但我收到的返回如下。发送 0-31 rx 224-255,发送 32-63 rx 32-63,发送 64 rx 224。在 avr(它是 8 位,所以我不知道如何发送多个字节)我将它作为 uint8_t 接收。如果我想处理整数而不是字符串,我的方法是否很糟糕?
  • 我会使用 avr 中的 Serial.print Serial.println - 进行 ascii 通信和换行 \n 作为我可以观察的分隔符;和StrToInt 解析来自python的数据;当然你也可以使用二进制协议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
相关资源
最近更新 更多