python to arduino serial read & write python to arduino serial read & write python python

python to arduino serial read & write


You shouldn't be closing the serial port in Python between writing and reading. There is a chance that the port is still closed when the Arduino responds, in which case the data will be lost.

while running:      # Serial write section    setTempCar1 = 63    setTempCar2 = 37    setTemp1 = str(setTempCar1)    setTemp2 = str(setTempCar2)    print ("Python value sent: ")    print (setTemp1)    ard.write(setTemp1)    time.sleep(6) # with the port open, the response will be buffered                   # so wait a bit longer for response here    # Serial read section    msg = ard.read(ard.inWaiting()) # read everything in the input buffer    print ("Message from arduino: ")    print (msg)

The Python Serial.read function only returns a single byte by default, so you need to either call it in a loop or wait for the data to be transmitted and then read the whole buffer.

On the Arduino side, you should consider what happens in your loop function when no data is available.

void loop(){  // serial read section  while (Serial.available()) // this will be skipped if no data present, leading to                             // the code sitting in the delay function below  {    delay(30);  //delay to allow buffer to fill     if (Serial.available() >0)    {      char c = Serial.read();  //gets one byte from serial buffer      readString += c; //makes the string readString    }  }

Instead, wait at the start of the loop function until data arrives:

void loop(){  while (!Serial.available()) {} // wait for data to arrive  // serial read section  while (Serial.available())  {    // continue as before

EDIT 2

Here's what I get when interfacing with your Arduino app from Python:

>>> import serial>>> s = serial.Serial('/dev/tty.usbmodem1411', 9600, timeout=5)>>> s.write('2')1>>> s.readline()'Arduino received: 2\r\n'

So that seems to be working fine.

In testing your Python script, it seems the problem is that the Arduino resets when you open the serial port (at least my Uno does), so you need to wait a few seconds for it to start up. You are also only reading a single line for the response, so I've fixed that in the code below also:

#!/usr/bin/pythonimport serialimport syslogimport time#The following line is for serial over GPIOport = '/dev/tty.usbmodem1411' # note I'm using Mac OS-Xard = serial.Serial(port,9600,timeout=5)time.sleep(2) # wait for Arduinoi = 0while (i < 4):    # Serial write section    setTempCar1 = 63    setTempCar2 = 37    ard.flush()    setTemp1 = str(setTempCar1)    setTemp2 = str(setTempCar2)    print ("Python value sent: ")    print (setTemp1)    ard.write(setTemp1)    time.sleep(1) # I shortened this to match the new value in your Arduino code    # Serial read section    msg = ard.read(ard.inWaiting()) # read all characters in buffer    print ("Message from arduino: ")    print (msg)    i = i + 1else:    print "Exiting"exit()

Here's the output of the above now:

$ python ardser.pyPython value sent:63Message from arduino:Arduino received: 63Arduino sends: 1Python value sent:63Message from arduino:Arduino received: 63Arduino sends: 1Python value sent:63Message from arduino:Arduino received: 63Arduino sends: 1Python value sent:63Message from arduino:Arduino received: 63Arduino sends: 1Exiting


First you have to install a module call Serial. To do that go to the folder call Scripts which is located in python installed folder. If you are using Python 3 version it's normally located in location below,

C:\Python34\Scripts  

Once you open that folder right click on that folder with shift key. Then click on 'open command window here'. After that cmd will pop up. Write the below code in that cmd window,

pip install PySerial

and press enter.after that PySerial module will be installed. Remember to install the module u must have an INTERNET connection.


after successfully installed the module open python IDLE and write down the bellow code and run it.

import serial# "COM11" is the port that your Arduino board is connected.set it to port that your are using        ser = serial.Serial("COM11", 9600)while True:    cc=str(ser.readline())    print(cc[2:][:-5])   


I found it is better to use the command Serial.readString() to replace the Serial.read() to obtain the continuous I/O for Arduino.