我正在使用Arduino SoftwareSerial库将串行数据发送到Raspberry Rx引脚。我可以成功地将Arduino串行数据发送到Raspberry,因为我发送的整数作为字符串中的等价物到达。
问题:
我试图将.readline()返回的字符串转换为float或int,但我无法这样做。
import serial
oSer = serial.Serial("/dev/ttyAMA0",baudrate=57600,timeout=1)
while True:
sInput = oSer.readline()
print sInput #Returns: >>1,2,3,
lsInput = sInput.split(',')
print lsInput #Returns: >>['1','2','3','\r\n']
如何将其转换为int或float?我只需要对数字进行一些算术运算。我试过了:
lfInput = [float(i) for i in lsInput] #Returns: >> ValueError: could not convert to float:
liInput = [int(i) for i in lsInput] #Returns: >> ValueError: invalid literal for int() with base 10: ''
答案
感谢提供Answers的John和Padraic,我可以确认有关如何解决上述问题的更新。我更喜欢Padraic的解决方案,稍微优雅,但要么工作。我添加了以下内容:
John's,特别是Pad的解决方案(请参阅下面的答案以获得更好和更详细的信息):
sInput = oSer.readline().strip() #but see answers below from Pad for more detail
答案 0 :(得分:3)
错误是由行末import serial
oSer = serial.Serial("/dev/ttyAMA0",baudrate=9600,timeout=1)
while True:
sSerialInput = oSer.readline()
print sSerialInput
引起的。 \r\n
和int()
不喜欢这样。
您可以像这样剥离它:
float()
或者您可以修改循环以忽略非数字:
sInput = oSer.readline().strip()
答案 1 :(得分:1)
您可以rstrip
尾随空格:
while True:
sInput = oSer.readline().rstrip().split(",")
或者更强大的方法是查看是否可以使用try / except将元素强制转换为浮点数:
def cast(it):
for ele in it:
try:
yield float(ele)
except ValueError:
pass
while True:
sInput = oSer.readline().rstrip(",\r\n").split(",")
nums = list(cast(sInput.split(",")))
cast
适用于浮点数,整数和负数。