3

I am trying to read potential meter data from Arduino using python, with the program on Arduino as follows :

#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);
}

the program on the arduino side is running fine

and program in python as follows

from cvzone.SerialModule import SerialObject

arduino = SerialObject("COM7")

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

but I get this error:

Traceback (most recent call last):
    data = arduino.getData()
  File "C:...\site-packages\cvzone\SerialModule.py", line 68, in getData
    data = data.decode("utf-8")
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf7 in position 0: invalid start byte

How to solve it?

2
  • the new USB connection resets the Mega and it spends some time in bootloader waiting for upload. Commented Dec 6, 2021 at 13:32
  • Maybe add some delay on the Arduino after initializing the serialData in startup() before it starts sending data in the loop(). Commented Dec 6, 2021 at 14:45

2 Answers 2

2

I would embed the call to .getData() into a try block and handle this specific exception with except UnicodeDecodeError. There can always be a transmission error, especially when the script is started.

However, I would do it differently:

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

...and on the python side use serial.readline() from pyserial instead. But I don't know cvzone and you might have a reason to use this instead of the commonly used pyserial.

0
0

There seems that there may be an issue with the implementation of getData() in SerialModule.py.

From line 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]

The block of code containing the readLine() should probably be with in a try...except block, like so:

    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

An issue has been raised on Github: SerialModule.py - readLine() should be within try block. #49

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.