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