Я пытаюсь получить последовательные данные с моего 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)

Любой обходной путь или решение этой проблемы? Я полностью потерян.

Edit1: я побежал

>>> float(b'1.80\r\n')
1.8

В другой консоли Python, и он работает совершенно нормально. В чем проблема, когда он читается на pyserial?

0
Ruthless 25 Фев 2020 в 20:36

2 ответа

Посмотрев на это долгое время, я обнаружил, что первоначально в течение нескольких итераций Arduino отправлял данные NULL. Вернее, он отправлял 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
0
Ruthless 25 Фев 2020 в 20:07

Попробуйте это, если у вас все еще есть проблемы, пожалуйста, напечатайте значение перед попыткой приведения

Попробуйте использовать .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(",", "."))
0
Wonka 25 Фев 2020 в 17:43