Python невозможно преобразовать декодированные последовательные данные utf-8 в строке в числа с плавающей запятой - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь получить последовательные данные с моего 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, и она работает совершенно нормально. В чем проблема при чтении из псевдонима?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

После долгого изучения я обнаружил, что первоначально в течение нескольких итераций 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 голосов
/ 25 февраля 2020

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

Рассмотрите возможность использования .strip () для очистки входного значения. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...