The pyserial library helps your Raspberry Pi talk to other devices using serial ports. It makes sending and receiving data easy.
You want to read data from a sensor connected via serial port.
You need to send commands to a microcontroller like Arduino.
You want to log data from a serial device to your Raspberry Pi.
You are debugging serial communication between devices.
You want to control a device that uses serial communication.
Syntax
Raspberry Pi
import serial
ser = serial.Serial(port, baudrate, timeout=1)
ser.write(data)
data = ser.read(size)
ser.close()
port is the name of the serial port (like /dev/ttyUSB0 on Raspberry Pi).
baudrate is the speed of communication (e.g., 9600).
Examples
Open serial port /dev/ttyUSB0 at 9600 baud, send 'Hello', read 5 bytes, then close.
Raspberry Pi
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
ser.write(b'Hello')
data = ser.read(5)
ser.close()
Use with to open port /dev/ttyS0 at 115200 baud, send 'Ping', read a line, and print it.
Raspberry Pi
import serial
with serial.Serial('/dev/ttyS0', 115200, timeout=2) as ser:
ser.write(b'Ping')
response = ser.readline()
print(response)
Sample Program
This program opens the serial port, sends a greeting, reads up to 20 bytes from the device, prints what it got, and closes the port.
Raspberry Pi
import serial
# Open serial port
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
# Send a message
ser.write(b'Hello Raspberry Pi')
# Read response (up to 20 bytes)
response = ser.read(20)
# Print the responseprint('Received:', response)
# Close the port
ser.close()
OutputSuccess
Important Notes
Always close the serial port after use to free it for other programs.
Use timeout to avoid waiting forever when reading.
Data sent and received must be bytes, so prefix strings with b.
Summary
pyserial lets Raspberry Pi communicate over serial ports easily.
Open a port, send bytes, read bytes, then close the port.
Use timeouts and proper port names for smooth communication.
Practice
(1/5)
1. What is the main purpose of the pyserial library when used with Raspberry Pi?
easy
A. To communicate with devices over serial ports
B. To create graphical user interfaces
C. To manage Wi-Fi connections
D. To control GPIO pins directly
Solution
Step 1: Understand pyserial's role
pyserial is designed to handle serial communication, which means sending and receiving data over serial ports.
Step 2: Compare options with pyserial's function
Options B, C, and D relate to GUI, Wi-Fi, and GPIO control, which are not pyserial's purpose.
Final Answer:
To communicate with devices over serial ports -> Option A
Quick Check:
pyserial = serial communication [OK]
Hint: pyserial = serial port communication library [OK]
Common Mistakes:
Confusing pyserial with GPIO control libraries
Thinking pyserial manages network connections
Assuming pyserial creates user interfaces
2. Which of the following is the correct way to open a serial port using pyserial in Python?
easy
A. serial.Open(port='/dev/ttyUSB0', speed=9600)
B. serial.connect('/dev/ttyUSB0', 9600)
C. serial.Serial(port='/dev/ttyUSB0', baudrate=9600, timeout=1)
D. serial.start(port='/dev/ttyUSB0', baud=9600)
Solution
Step 1: Recall pyserial syntax for opening ports
The correct method is to create a Serial object with parameters: port, baudrate, and optionally timeout.
Step 2: Check each option's method and parameters
Only serial.Serial(port='/dev/ttyUSB0', baudrate=9600, timeout=1) uses serial.Serial() with correct parameter names and values.
Final Answer:
serial.Serial(port='/dev/ttyUSB0', baudrate=9600, timeout=1) -> Option C
Quick Check:
Use serial.Serial() with port and baudrate [OK]
Hint: Use serial.Serial() with port and baudrate [OK]
Common Mistakes:
Using incorrect method names like Open or connect
Using wrong parameter names like speed or baud
Omitting required parameters
3. What will be the output of this code snippet if the serial device sends the bytes b'OK'?
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
response = ser.read(2)
print(response)
ser.close()
medium
A. b'OK'
B. 'OK'
C. OK
D. b"\x00\x00"
Solution
Step 1: Understand ser.read(2) behavior
The read(2) method reads 2 bytes from the serial port and returns them as a bytes object.
Step 2: Interpret the print output
Printing a bytes object shows it with a leading b and quotes, so b'OK' will be printed.
4. Identify the error in this pyserial code snippet:
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
ser.write('Hello')
ser.close()
medium
A. The close method should be called before write
B. The Serial constructor is missing the timeout parameter
C. The port name '/dev/ttyUSB0' is invalid
D. The write method requires bytes, not a string
Solution
Step 1: Check the write method argument type
pyserial's write() expects bytes, but 'Hello' is a string, causing a TypeError.
Step 2: Verify other parts of the code
Timeout is optional, port name can be valid, and close() should be after write().
Final Answer:
The write method requires bytes, not a string -> Option D
Quick Check:
write() needs bytes, encode strings first [OK]
Hint: Always encode strings to bytes before write() [OK]
Common Mistakes:
Passing string directly to write() without encoding
Thinking timeout is mandatory
Closing port before writing data
5. You want to read lines from a serial device that sends text ending with newline characters. Which pyserial method and parameters should you use to read a full line safely with a 2-second timeout?
hard
A. Use serial.Serial('/dev/ttyUSB0', 9600, timeout=None) and ser.readline()
B. Use serial.Serial('/dev/ttyUSB0', 9600, timeout=2) and ser.readline()
C. Use serial.Serial('/dev/ttyUSB0', 9600) and ser.read(100)
D. Use serial.Serial('/dev/ttyUSB0', 9600, timeout=0) and ser.readline()
Solution
Step 1: Set timeout for safe reading
Setting timeout=2 seconds ensures readline() waits up to 2 seconds for a line, avoiding blocking forever.
Step 2: Use readline() to read full lines
readline() reads until newline character, perfect for line-based text from serial devices.
Final Answer:
Use serial.Serial('/dev/ttyUSB0', 9600, timeout=2) and ser.readline() -> Option B
Quick Check:
timeout + readline() = safe line read [OK]
Hint: Use timeout with readline() to avoid blocking [OK]
Common Mistakes:
Using read() instead of readline() for lines
Setting timeout=None causes blocking
Setting timeout=0 causes non-blocking read with no wait
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.