我已经看到这个无效的文字错误意味着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的新手,但它的可行性令人难以置信的愚蠢。
答案 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: ''
可能是因为它们将无效文字字符串格式化为错误消息。但是,沿途的一些库调用将空字节解释为空终止符,而不是打印字符串的其余部分。