0

我已经看到这个无效的文字错误,这意味着 python 端的 int() 中的数据不是像预期的那样以 10 为基数。我明白了,但在 arduino 方面,我通过串行发送它:

void loop()
{
  temperature = bmp085GetTemperature(bmp085ReadUT());
  pressure = bmp085GetPressure(bmp085ReadUP());
  Serial.println(temperature, DEC);  //fails on python side, outputs a 240 usually
  delay(50);
  Serial.println(pressure, DEC); //pa
  delay(1000);
}

在 python 方面,我用这个来选择它:

while True:
     if(serialFromArduino.inWaiting() > 0):
          input = serialFromArduino.readline().rstrip()
          print(input)
          inputAsInteger =int(input)   #FAILS
          print("done")

甚至做了一个 rstrip 以确保我摆脱任何 \t\r\n 等。

所以我很困惑为什么常数

pi@raspberrypi ~/pythoncode $ python serialtest.py
Running
240
Traceback (most recent call last):
 File "serialtest.py", line 18, in <module>
   inputAsInteger =int(input)
 ValueError: invalid literal for int() with base 10: ''

只是不确定我错过了什么?虽然是 python 的新手,但它是可行的,但我正在做的事情非常愚蠢。

4

2 回答 2

1

该错误意味着您的输入收到一个空行'',并且您尝试将其转换为整数。

您应谨慎处理 处的外部输入input = serialFromArduino.readline()。如果它不是一个正确的整数(例如,空行或一些噪音),您的程序将崩溃。例如,您应该:

try:
    input = serialFromArduino.readline().rstrip()
except ValueError:
    raise InputError('got bad value {}'.format(input))
于 2013-05-20T05:34:51.307 回答
1

听起来您的数据有一堆空字节(ASCII 代码 0x00)。您需要使用 删除它们strip('\x00')。默认情况下strip()只删除不包括空字节的空白。所以我们指定手动删除哪些字节。

 if(serialFromArduino.inWaiting() > 0):
      input = serialFromArduino.readline().strip().strip('\x00')      # <--
      print(input)
      inputAsInteger = int(input)
      print("done")

也许更好的解决方案是确定空字节的来源并防止这种串行带宽的巨大浪费发生。

PS。错误消息在这里如此无用的原因:

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

可能是因为他们将无效文字字符串格式化为错误消息。但是,沿途的一些库调用将空字节解释为空终止符,而不是打印字符串的其余部分。

于 2013-05-20T05:36:44.897 回答