Ardunio and Python Interface

I am currently interfacing the Ardunio and Python via serial port. Serial port shows 3 sensor signal and python need to pick up it from specified serial port. I created a GUI and when I run the python code initially it is reading all data but after some time it shows following error

“g_value1=float(g_value1)
ValueError: could not convert string to float:”

can anyone help me to resolve this …

I hereby attached relevant files of codes…

Analog_sensor_reading.ino (1.09 KB)

g1.png

I would give it a try but know that I am not a Python developer.

I would use 2 variables: one string variable that I understand it is read from somewhere, and another one that you parse (not cast) from the string one

You end a line with Serial.println(), so there is a \r\n at the end.

When opening the serial port, either use non-blocking with a timeout of zero or use a small timeout.
In Python you can do a line = ser.readline() followed by line.rstrip() to get rid of those \r\n.
Then you have to test it if there are four values available.
Only then you can convert them.

This is not a Python forum and it is a Python question. Perhaps you can ask it elsewhere. If you ask it on a other forum, please give a link to it.

This Simple Python - Arduino demo may be of interest.

...R

Your Arduino code is pretty straightforward and I don't see it going wrong unless the processor resets during the Serial.print section and puts out some garbage.

Thus your problem is likely on the Python side. To debug this one might put the string to number conversion code in a "try / except" and when it takes an exception, print out the string that was received. If I had to hazard a guess, your Python code isn't keeping up with the input data rate and the serial data is corrupted when the input buffer overflows.

It would be more reliable to interface Python with your Arduino using the compatible libraries: pySerialTransfer and SerialTransfer.h.

pySerialTransfer is pip-installable and cross-platform compatible. SerialTransfer.h runs on the Arduino platform and can be installed through the Arduino IDE’s Libraries Manager.

Both of these libraries have highly efficient and robust packetizing/parsing algorithms with easy to use APIs.

Example Python Script:

import time
from pySerialTransfer import pySerialTransfer as txfer


if __name__ == '__main__':
    try:
        link = txfer.SerialTransfer('COM17')
        
        link.open()
        time.sleep(2) # allow some time for the Arduino to completely reset
        
        while True:
            send_size = 0
            
            ###################################################################
            # Send a list
            ###################################################################
            list_ = [1, 3]
            list_size = link.tx_obj(list_)
            send_size += list_size
            
            ###################################################################
            # Send a string
            ###################################################################
            str_ = 'hello'
            str_size = link.tx_obj(str_, send_size) - send_size
            send_size += str_size
            
            ###################################################################
            # Send a float
            ###################################################################
            float_ = 5.234
            float_size = link.tx_obj(float_, send_size) - send_size
            send_size += float_size
            
            ###################################################################
            # Transmit all the data to send in a single packet
            ###################################################################
            link.send(send_size)
            
            ###################################################################
            # Wait for a response and report any errors while receiving packets
            ###################################################################
            while not link.available():
                if link.status < 0:
                    if link.status == -1:
                        print('ERROR: CRC_ERROR')
                    elif link.status == -2:
                        print('ERROR: PAYLOAD_ERROR')
                    elif link.status == -3:
                        print('ERROR: STOP_BYTE_ERROR')
            
            ###################################################################
            # Parse response list
            ###################################################################
            rec_list_  = link.rx_obj(obj_type=type(list_),
                                     obj_byte_size=list_size,
                                     list_format='i')
            
            ###################################################################
            # Parse response string
            ###################################################################
            rec_str_   = link.rx_obj(obj_type=type(str_),
                                     obj_byte_size=str_size,
                                     start_pos=list_size)
            
            ###################################################################
            # Parse response float
            ###################################################################
            rec_float_ = link.rx_obj(obj_type=type(float_),
                                     obj_byte_size=float_size,
                                     start_pos=(list_size + str_size))
            
            ###################################################################
            # Display the received data
            ###################################################################
            print('SENT: {} {} {}'.format(list_, str_, float_))
            print('RCVD: {} {} {}'.format(rec_list_, rec_str_, rec_float_))
            print(' ')
    
    except KeyboardInterrupt:
        link.close()
    
    except:
        import traceback
        traceback.print_exc()
        
        link.close()

Example Arduino Sketch:

#include "SerialTransfer.h"


SerialTransfer myTransfer;


void setup()
{
  Serial.begin(115200);
  myTransfer.begin(Serial);
}


void loop()
{
  if(myTransfer.available())
  {
    // send all received data back to Python
    for(uint16_t i=0; i < myTransfer.bytesRead; i++)
      myTransfer.txBuff[i] = myTransfer.rxBuff[i];
    
    myTransfer.sendData(myTransfer.bytesRead);
  }
}

On the Arduino side, you can use myTransfer.txObj() and myTransfer.rxObj() to copy values to the library’s RX buffer and parse multi-byte variables out of the library’s TX buffer.

For theory behind robust serial communication, check out the tutorials Serial Input Basics and Serial Input Advanced.