数据来自arduino到python(raspberryPi)无效的文字错误

时间:2013-05-20 05:24:18

标签: python arduino raspberry-pi

我已经看到这个无效的文字错误意味着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的新手,但它的可行性令人难以置信的愚蠢。

2 个答案:

答案 0 :(得分:1)

错误表示您的输入收到空行'',并尝试将其转换为整数。

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

try:
    input = serialFromArduino.readline().rstrip()
except ValueError:
    raise InputError('got bad value {}'.format(input))

答案 1 :(得分:1)

听起来你的数据有一堆空字节(ASCII码0x00)。您需要使用strip('\x00')删除它们。默认情况下,strip()仅删除whitspace,后者不包含空字节。所以我们指定要手动删除的字节。

 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: ''

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