Получение данных из arduino с помощью python

Я пытаюсь прочитать данные потенциального измерителя из Arduino, используя python, с помощью программы на Arduino следующим образом :

#include <cvzone.h>

SerialData serialData;
int sendVals[2];

void setup() {
  serialData.begin(9600);
}

void loop() {
  int potVal = analogRead(A0);
  sendVals[0]= potVal;
  serialData.Send(sendVals);
}

программа на стороне arduino работает нормально

и программа на python следующим образом

from cvzone.SerialModule import SerialObject

arduino = SerialObject("COM7")

while True:
   data = arduino.getData()
   print(data[0])

но я получаю ошибку :(

Traceback (последний последний вызов): data = arduino.getData() Файл "C:...\site-packages\cvzone\SerialModule.py", строка 68, в getData data = data.decode("utf-8") UnicodeDecodeError: кодек 'utf-8' не может декодировать байт 0xf7 в позиции 0: недопустимый начальный байт

как ее решить?

, 👍3

Обсуждение

новое USB - соединение сбрасывает Mega, и он проводит некоторое время в загрузчике в ожидании загрузки., @Juraj

Возможно, добавить некоторую задержку на Arduino после инициализации serialData в startup (), прежде чем он начнет отправлять данные в loop()., @Dave X


2 ответа


Лучший ответ:

2

Я бы вставил вызов .getData() в блок try и обработал это конкретное исключение с помощью UnicodeDecodeError. Всегда может быть ошибка передачи, особенно при запуске скрипта.

Однако я бы сделал это по-другому:

void loop() {
  Serial.println(analogRead(A0));
}

...а на стороне python используйте serial.readline() из pyserial. Но я не знаю cvzone, и у вас может быть причина использовать это вместо обычно используемого pyserial.

,

большое вам спасибо, это действительно помогло мне :), @M. Al lail Qadrillah


0

Похоже, что может возникнуть проблема с реализацией getData() в SerialModule.py.

Из строки 62

    def getData(self):
        """
        :param numOfVals: number of vals to retrieve
        :return: list of data received
        """
        data = self.ser.readline()
        data = data.decode("utf-8")
        data = data.split('#')
        dataList = []
        [dataList.append(d) for d in data]
        return dataList[:-1]

Блок кода, содержащий readLine(), вероятно, должен находиться в блоке try...except, например:

    def getData(self):
        """
        :param numOfVals: number of vals to retrieve
        :return: list of data received
        """
        try:
            data = self.ser.readline()
            data = data.decode("utf-8")
            data = data.split('#')
            dataList = []
            [dataList.append(d) for d in data]
            return dataList[:-1]
        except Exception as e:
            print(e)
            self.ser.close

На Github возникла проблема: SerialModule.py — readLine() должен находиться в пределах блока try. #49

,