Python 无法将字符串中的 utf-8 解码串行数据转换为浮点数
Python unable to convert utf-8 decoded serial data in string to floats
我正在尝试从我的 Arduino 获取串行数据到我的 python 控制台
这是我的 Arduino 代码:
void setup() {
Serial.begin(115200);
Serial.setTimeout(10);
randomSeed(analogRead(0));
}
void loop() {
float x = float(random(0,200))/100;
Serial.println(x);
}
我需要为我的 python 程序获取 运行dom 变量。为此,我正在使用 Pyserial。
这是我的Python程序
import serial
ser = serial.Serial('/dev/ttyACM0',baudrate=115200,timeout=0.1)
ser.flushInput()
while 1:
sens = ser.read(ser.inWaiting())
sens = sens[0:len(sens)-2].decode("utf-8")
print(float(sens))
然后出现错误
ValueError: could not convert string to float:
我尝试了多种方法解决这个问题,但没有解决方案。
问题出在转换 float(sens)
上。
我需要此数据作为其他操作的浮点数。
只是为了检查我 运行 代码中的一些更改
sens = ser.read(ser.inWaiting())
print(sens,end="\t")
print(type(sens))
sens = sens[0:len(sens)-2]
print(sens,end="\t")
print(type(sens))
sens = sens.decode("utf-8")
print(sens,end="\t")
print(type(sens))
我得到的输出是
b'1.89\r\n' <class 'bytes'>
b'1.89' <class 'bytes'>
1.89 <class 'str'>
如您所见,最终变量是一个字符串,它是我在 运行 sens = sens.decode("utf-8")
时得到的。然而,当我 运行 float(sens)
时,我仍然无法从该字符串中获取浮点数据
对此有任何解决方法或解决方案吗?我完全迷路了。
编辑1:
我运行
>>> float(b'1.80\r\n')
1.8
在另一个 python 控制台中,它工作得很好。 pyserial读取时有什么问题?
试试这个,如果还有问题,请在尝试转换前打印值
考虑使用 .strip() 来清理输入值
b = b'1.89\r\n'
float(b.strip())
float("10") --> 10.0
float("10.2") --> 10.2
float("10,2") --> #CRASH ValueError: invalid literal for float(): 10,22
#SOLUTION
float("10,22".replace(",", ".")) --> 10.22
结论
float(b.strip().replace(",", "."))
看了很长时间后,我发现最初在几次迭代中,Arduino 发送的是 NULL 数据。或者更确切地说,它正在连续发送 b''
。 THIS 就是问题所在。
我现在确定了,因为我在 python 控制台中检查过这个。
>>> float(b'1.0')
1.0
>>> float(b'')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float:
所以为了克服这个问题,我所要做的就是在每次迭代中进行简单的比较。
比如
if sens != b'':
continue
else:
break
我正在尝试从我的 Arduino 获取串行数据到我的 python 控制台
这是我的 Arduino 代码:
void setup() {
Serial.begin(115200);
Serial.setTimeout(10);
randomSeed(analogRead(0));
}
void loop() {
float x = float(random(0,200))/100;
Serial.println(x);
}
我需要为我的 python 程序获取 运行dom 变量。为此,我正在使用 Pyserial。
这是我的Python程序
import serial
ser = serial.Serial('/dev/ttyACM0',baudrate=115200,timeout=0.1)
ser.flushInput()
while 1:
sens = ser.read(ser.inWaiting())
sens = sens[0:len(sens)-2].decode("utf-8")
print(float(sens))
然后出现错误
ValueError: could not convert string to float:
我尝试了多种方法解决这个问题,但没有解决方案。
问题出在转换 float(sens)
上。
我需要此数据作为其他操作的浮点数。
只是为了检查我 运行 代码中的一些更改
sens = ser.read(ser.inWaiting())
print(sens,end="\t")
print(type(sens))
sens = sens[0:len(sens)-2]
print(sens,end="\t")
print(type(sens))
sens = sens.decode("utf-8")
print(sens,end="\t")
print(type(sens))
我得到的输出是
b'1.89\r\n' <class 'bytes'>
b'1.89' <class 'bytes'>
1.89 <class 'str'>
如您所见,最终变量是一个字符串,它是我在 运行 sens = sens.decode("utf-8")
时得到的。然而,当我 运行 float(sens)
对此有任何解决方法或解决方案吗?我完全迷路了。
编辑1: 我运行
>>> float(b'1.80\r\n')
1.8
在另一个 python 控制台中,它工作得很好。 pyserial读取时有什么问题?
试试这个,如果还有问题,请在尝试转换前打印值
考虑使用 .strip() 来清理输入值
b = b'1.89\r\n'
float(b.strip())
float("10") --> 10.0
float("10.2") --> 10.2
float("10,2") --> #CRASH ValueError: invalid literal for float(): 10,22
#SOLUTION
float("10,22".replace(",", ".")) --> 10.22
结论
float(b.strip().replace(",", "."))
看了很长时间后,我发现最初在几次迭代中,Arduino 发送的是 NULL 数据。或者更确切地说,它正在连续发送 b''
。 THIS 就是问题所在。
我现在确定了,因为我在 python 控制台中检查过这个。
>>> float(b'1.0')
1.0
>>> float(b'')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float:
所以为了克服这个问题,我所要做的就是在每次迭代中进行简单的比较。 比如
if sens != b'':
continue
else:
break