Python无法将字符串中的utf8解码串行数据转换为浮点

2024-05-29 05:10:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将串行数据从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程序中。为此,我使用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读取时有什么问题


Tags: 数据代码程序typeserialfloatarduinoser
2条回答

尝试此操作,如果仍然存在问题,请在尝试强制转换之前打印值

考虑使用.SUTE()来清除输入值

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发送的是空数据。或者更确切地说,它是连续发送b''。这就是问题所在

我现在可以肯定,因为我在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

相关问题 更多 >

    热门问题