Serial Communication between Python and Arduino

Use Python to communicate between Arduino.

Nov 6, 2020

292193 views

13 respects

Components and supplies

1

Arduino UNO

Apps and platforms

1

Arduino IDE

1

Python IDLE

1

PySerial Library

Project description

Code

Python Code

python

Python Code

python

Arduino Code

arduino

Comments

Only logged in users can leave comments

nohutpilav123

4 months ago

Hello friends. I want to send data from Python to Arduino, this is my main purpose. I am writing my codes, when I enter a number from the vs terminal, the number should be visible on the Arduino serial screen. However, since the COMs overlap, I get a COM busy error on the Arduino serial screen. I cannot run the same COM in two applications, but I should see the data on the Arduino serial screen. How do I do this?

slavk

18 days ago

Try closing Arduino IDE, it takes the com port for it self. First compile the arduino code in arduino IDE, then close it and start the python code. If that doesn`t work, try closing arduino IDE using the task manager.

supermarkio33

a year ago

Hi, i have encountered a strange problem. I used a similar code to turn on a LED on arduino UNO and it worked, but i needed modify it a little bit so that instead of waiting for an input from a person behind a PC, the python code would send a string to arduino. This is the modified code i've made: k = 'smth' arduino.write(k.encode()) This code doesn't get the LED turned on, while the following code: k = input('enter: ') arduino.write(k.encode()) does!!! Now, I don't understand what causes the problem, both codes are logically equivalent, the only difference is that in the second code i used input function. Is there something special about the input function in python? What am i missing? Here is the relevant arduino code: void loop() { if (Serial.available() > 0) { char word = Serial.read(); if (word == 'X') { digitalWrite(ledPin, HIGH); } else if (word == 'Y') { digitalWrite(ledPin, LOW); } } }

haydenb1800

a year ago

I had the same problem and found the answer on this website: https://pythonforundergradengineers.com/python-arduino-LED.html When they made the serial connection in python they set the baud rate to 9800 and 9600 in Arduino

Anonymous user

2 years ago

Hii I need help. I am connecting it to bolt IoT module and am referring code from https://create.arduino.cc/projecthub/saipavan4/intruder-alert-system-12df59 If i execute the Arduino code i get this error In function 'void loop()': warning: return-statement with a value, in function returning 'void' [-fpermissive] return duration; warning: return-statement with a value, in function returning 'void' [-fpermissive] return data; I know what the error means but how do I rectify?

Anonymous user

2 years ago

I'm a beginner... I had complete all my coding in python... Is there anyways to transfer the python code into arduino?

Anonymous user

2 years ago

I have a problem. I'm sending commands via usb like "D99" which tells the arduino to move a stepper motor 99 steps. I'm sending them in batch to reduce latency. When using a Uno board, it works flawlessly. But when I'm using a Nano, it seems like it it doesn't receive anything. (I tried 2 clones and an official one). Any idea why this behavior is happening ? Thank you.

Anonymous user

2 years ago

I want to make a similar code, but I want to send a signal from arduino to phyton. like when you press an arduino button to start a phyton sound

Anonymous user

2 years ago

When you print something from the Arduino to the serial port, it can be read by the python code. You simply have to do Serial.print() in the Arduino code to print onto the serial monitor and use arduino.readline() in the python code to read whatever has been printed on the serial monitor

Anonymous user

2 years ago

This is really helpful. However, one strange behavior is driving me a bit nut: In python code, if I change the code in this way it won't work. The change is to take the variable from local instead of user input: # Importing Libraries import serial import time arduino = serial.Serial(port='COM4', baudrate=115200, timeout=.1) def write_read(x): arduino.write(bytes(x, 'utf-8')) time.sleep(0.05) data = arduino.readline() return data while True: # num = input("Enter a number: ") # Taking input from user num = str(2) value = write_read(num) print(value) # printing the value And It will work again if I do this: num = input("Enter a number: ") # Taking input from user num = str(2) This is non-sense. What's the matter?

Anonymous user

2 years ago

I also noticed that the first run often doesn't work. 2nd number keyed in will work,

Anonymous user

2 years ago

Hello, did you manage to solve this? I'm having the exact same issue and it's driving me nuts

Anonymous user

2 years ago

It takes time to open the serial port about 2-3 seconds. Your early requests might be firing before the actual port is opened. Adding time.sleep(3) before the while loop might help.

Anonymous user

2 years ago

Hi, I don't understand all the code above To get data from my Arduino UNO and, for exemple, send them to a sqlite database I do simply: ser = serial.Serial('/dev/ttyACM0', 9600) while True : values = ser.readline().decode() return values If there is a packets of data I put them in a python liste and use the liste for a SQL query. It works fine.

Anonymous user

2 years ago

Thank you very much. It works !!!

Anonymous user

2 years ago

This works well. great tutorial. Could you help me on how to read digital and analog pin data from arduino and use those values in python.

Anonymous user

2 years ago

Use pyduino, it's fairly easy.

Anonymous user

2 years ago

we can receive data from the computer too?

Anonymous user

2 years ago

I don't really know what this is supposed to do, but anyway my Pycharm doesn't seem able to have access to the serial port I looked this up on the internet and they said that you can't use an already opened COM port, which means you can't use the Serial port if another is using it I might just get the idea wrong but when running two program seperately it works like a charm So did I miss something or that is just how it supposed to work

Anonymous user

2 years ago

Hi, this is very helpful, but I am currently encountering the problem of receiving data such as "\\x00\\x00\\x00" when using .readline() in the python code. How do I fix that?

Anonymous user

2 years ago

You could use readline().rstrip() to remove all the additional data (\ \ etc..). I don't know if you have found a solution or not, I'll leave a suggestion here in case someone encounters the same problem.

Anonymous user

2 years ago

ty man, works like a charm. tried it on Leonardo

Anonymous user

2 years ago

The ‘data transfer’, between Arduino and Python, work, well. But, the “data” received by Python from Arduino, has a type: <class ‘byte’>. So, I cannot use the data, as I don’t really know what <class ‘byte’> is or how to convert the type into an int or str. What is the simplest way to convert the data into a string or a real number?

Anonymous user

2 years ago

Thanks for reply. I tried it and it works fine.

Anonymous user

2 years ago

Try "arduino.readline().decode('utf-8').rstrip()" this will decode the received bytes into 'utf-8' string, the one that python can understand.

Anonymous user

2 years ago

This is just what I was looking for except: I've got the Arduino code uploaded to Arduino WiFi Rev2. I've got the python code on my MacBook and running it from VSCode with the USB cable plugged in to the Arduino. The python program reports the following error: OSError: [Errno 16] Resource busy: '/dev/cu.usbmodem143402'. This is the port that shows in the lower right corner of the Arduino IDE as in your example. Why do I get this? Additional info.../Projects_M3/Serial_Port/.venv/lib/python3.9/site-packages/serial/serialposix.py", line 325, in open raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))

Anonymous user

2 years ago

OK, I must report progress: I tried to run the python program from the terminal instead of thru VSCode and it worked! (The Arduino code was uploaded yesterday) Next, I "re-uploaded" the same code to the Arduino but hit the reset key after uploading and then started the python code from VSCode. It works! I suspect the upload to Arduino of the code somehow "ties up" the port until the reset and then it is still "busy" until reset. Hope this helps someone else :)

Anonymous user

2 years ago

OK, I spoke too soon. The problem is back. I thought the solution was to restart my laptop since I had done that before and it appeared to work. But now, no amount of resetting or restarting will keep this from happening. I am mystified! :(

Anonymous user

2 years ago

I am no longer mystified. I figured it out. With the board connected to my laptop with the USB cable, I was using the serial monitor on the Arduino IDE and my program was sending values to the monitor as info for debugging. If I turn off the Arduino IDE serial monitor (board still connected via USB for power) and run the python program (either from VSCode or the Terminal app on the laptop) the connection works every time! Seems obvious to me now...Duh. Now I need to figure out how to access one of the other serial ports on the Arduino so I can see the values being sent from the laptop.

justboughtadruinoyesterday

2 years ago

I don't really know what this is supposed to do, but anyway my Pycharm doesn't seem able to have access to the serial port I looked this up on the internet and they said that you can't use an already opened COM port, which means you can't use the Serial port if another is using it I might just get the idea wrong but when running two program seperately it works like a charm So did I miss something or that is just how it supposed to work

Anonymous user

2 years ago

Hi, I don't understand all the code above To get data from my Arduino UNO and, for exemple, send them to a sqlite database I do simply: ser = serial.Serial('/dev/ttyACM0', 9600) while True : values = ser.readline().decode() return values If there is a packets of data I put them in a python liste and use the liste for a SQL query. It works fine.

Desertgeek

3 years ago

This is just what I was looking for except: I've got the Arduino code uploaded to Arduino WiFi Rev2. I've got the python code on my MacBook and running it from VSCode with the USB cable plugged in to the Arduino. The python program reports the following error: OSError: [Errno 16] Resource busy: '/dev/cu.usbmodem143402'. This is the port that shows in the lower right corner of the Arduino IDE as in your example. Why do I get this? Additional info.../Projects_M3/Serial_Port/.venv/lib/python3.9/site-packages/serial/serialposix.py", line 325, in open raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))

Desertgeek

2 years ago

I am no longer mystified. I figured it out. With the board connected to my laptop with the USB cable, I was using the serial monitor on the Arduino IDE and my program was sending values to the monitor as info for debugging. If I turn off the Arduino IDE serial monitor (board still connected via USB for power) and run the python program (either from VSCode or the Terminal app on the laptop) the connection works every time! Seems obvious to me now...Duh. Now I need to figure out how to access one of the other serial ports on the Arduino so I can see the values being sent from the laptop.

Desertgeek

2 years ago

OK, I must report progress: I tried to run the python program from the terminal instead of thru VSCode and it worked! (The Arduino code was uploaded yesterday) Next, I "re-uploaded" the same code to the Arduino but hit the reset key after uploading and then started the python code from VSCode. It works! I suspect the upload to Arduino of the code somehow "ties up" the port until the reset and then it is still "busy" until reset. Hope this helps someone else :)

Desertgeek

2 years ago

OK, I spoke too soon. The problem is back. I thought the solution was to restart my laptop since I had done that before and it appeared to work. But now, no amount of resetting or restarting will keep this from happening. I am mystified! :(

Anonymous user

3 years ago

I'm a beginner... I had complete all my coding in python... Is there anyways to transfer the python code into arduino?

tshome

3 years ago

Thank you very much. It works !!!

Anonymous user

3 years ago

we can receive data from the computer too?

Anonymous user

3 years ago

Hi, this is very helpful, but I am currently encountering the problem of receiving data such as "\\x00\\x00\\x00" when using .readline() in the python code. How do I fix that?

Anonymous user

2 years ago

You could use readline().rstrip() to remove all the additional data (\ \ etc..). I don't know if you have found a solution or not, I'll leave a suggestion here in case someone encounters the same problem.

Anonymous user

3 years ago

I want to make a similar code, but I want to send a signal from arduino to phyton. like when you press an arduino button to start a phyton sound

Anonymous user

2 years ago

When you print something from the Arduino to the serial port, it can be read by the python code. You simply have to do Serial.print() in the Arduino code to print onto the serial monitor and use arduino.readline() in the python code to read whatever has been printed on the serial monitor

Anonymous user

3 years ago

I have a problem. I'm sending commands via usb like "D99" which tells the arduino to move a stepper motor 99 steps. I'm sending them in batch to reduce latency. When using a Uno board, it works flawlessly. But when I'm using a Nano, it seems like it it doesn't receive anything. (I tried 2 clones and an official one). Any idea why this behavior is happening ? Thank you.

Anonymous user

3 years ago

This is really helpful. However, one strange behavior is driving me a bit nut: In python code, if I change the code in this way it won't work. The change is to take the variable from local instead of user input: # Importing Libraries import serial import time arduino = serial.Serial(port='COM4', baudrate=115200, timeout=.1) def write_read(x): arduino.write(bytes(x, 'utf-8')) time.sleep(0.05) data = arduino.readline() return data while True: # num = input("Enter a number: ") # Taking input from user num = str(2) value = write_read(num) print(value) # printing the value And It will work again if I do this: num = input("Enter a number: ") # Taking input from user num = str(2) This is non-sense. What's the matter?

Anonymous user

2 years ago

I also noticed that the first run often doesn't work. 2nd number keyed in will work,

Anonymous user

2 years ago

Hello, did you manage to solve this? I'm having the exact same issue and it's driving me nuts

Anonymous user

2 years ago

It takes time to open the serial port about 2-3 seconds. Your early requests might be firing before the actual port is opened. Adding time.sleep(3) before the while loop might help.

Anonymous user

3 years ago

Hii I need help. I am connecting it to bolt IoT module and am referring code from https://create.arduino.cc/projecthub/saipavan4/intruder-alert-system-12df59 If i execute the Arduino code i get this error In function 'void loop()': warning: return-statement with a value, in function returning 'void' [-fpermissive] return duration; warning: return-statement with a value, in function returning 'void' [-fpermissive] return data; I know what the error means but how do I rectify?

Anonymous user

3 years ago

The ‘data transfer’, between Arduino and Python, work, well. But, the “data” received by Python from Arduino, has a type: <class ‘byte’>. So, I cannot use the data, as I don’t really know what <class ‘byte’> is or how to convert the type into an int or str. What is the simplest way to convert the data into a string or a real number?

Anonymous user

2 years ago

Thanks for reply. I tried it and it works fine.

Anonymous user

2 years ago

Try "arduino.readline().decode('utf-8').rstrip()" this will decode the received bytes into 'utf-8' string, the one that python can understand.

keyur_paraskar

4 years ago

This works well. great tutorial. Could you help me on how to read digital and analog pin data from arduino and use those values in python.

Anonymous user

2 years ago

Use pyduino, it's fairly easy.

klinio

4 years ago

ty man, works like a charm. tried it on Leonardo

Anonymous user

4 years ago

I need help. When i start the program it shows following error: module 'serial' has no attribute 'Serial' Someone know how to fix that?

ansh2919

2 years ago

You're importing the module, not the class. So, you must write: from serial import Serial You also need to install serial module correctly: pip install pyserial

Anonymous user

2 years ago

Hi I have wrote from serial import Serial and I got this error from serial import Serial ImportError: cannot import name 'Serial' from 'serial' (C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\serial\\__init__.py) I have also installed pyserial (version 3.5) and uninstall serial but nothing seems working :(