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 Answers 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.
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
startup()
before it starts sending data in theloop()
.