
Serial ports are serial communication interfaces through which information is transferred sequentially one bit at a time. Parallel ports, on the other hand, transmit multiple bits simultaneously. The PySerial and functions like python serial read make communication with Serial Ports easier.
Python on a computer with the PySerial package installed can communicate with external hardware. It is a useful package for problem solvers because it facilitates data exchange between computers and external hardware like voltmeters, flow meters, lights, and other devices that send information via ports.
The PySerial package is NOT part of the Python Standard Library. Therefore, install manually. Anaconda Distributions of Python comes with the package pre-installed.
PIP Installation Command $ pip install pyserial
Anaconda Prompt Command > conda install pyserial
After installing, the version can be verified with the following command.
import serial print(serial.version)
serial.read()
Arguments – Pass an integer value to specify the number of bytes to be returned.
Returns – Provides us a number of specified bytes
Python serial read is an important function of the module. It allows us to rake in the information that is provided from the ports. Here’s a Python implementation that helps us to do so.
with serial.Serial('/my/sample1', 3443, timeout=1) as serial: readOneByte = serial.read() readTenByte = serial.read(10)
Explanation
By default, .read() reads one byte at a time. By providing an integer value, you can set how many bytes of information are to be read by the function.
| serial.read() | serial.readline() |
|---|---|
| serial.read() will return one byte at a time. | serial.readline() will return all bytes until it reaches EOL. |
| If an integer is specified within the function, it will that return that many bytes. Ex: serial.read(20) Will return 20 bytes. | Instead of using serial.read() over iterations, serial.readline() can be used. |
Ensure that your Raspberry Pi is up to date by running the following commands
sudo apt update sudo apt upgrade
ser = serial.Serial( # Serial Port to read the data from port='/dev/ttyUSB0', #Rate at which the information is shared to the communication channel baudrate = 9600, #Applying Parity Checking (none in this case) parity=serial.PARITY_NONE, # Pattern of Bits to be read stopbits=serial.STOPBITS_ONE, # Total number of bits to be read bytesize=serial.EIGHTBITS, # Number of serial commands to accept before timing out timeout=1 ) # Pause the program for 1 second to avoid overworking the serial port while 1: x=ser.readline() print x
import time import serial ser = serial.Serial( # Serial Port to read the data from port='/dev/ttyUSB0', #Rate at which the information is shared to the communication channel baudrate = 9600, #Applying Parity Checking (none in this case) parity=serial.PARITY_NONE, # Pattern of Bits to be read stopbits=serial.STOPBITS_ONE, # Total number of bits to be read bytesize=serial.EIGHTBITS, # Number of serial commands to accept before timing out timeout=1 ) counter=0 # Mentions the Current Counter number for each line written # Pauses for one second each iteration to avoid overworking the port while 1: ser.write("Write counter: %d \n"%(counter)) time.sleep(1) counter += 1
Using the .hex() function we are storing the byte data in hex format in the variable hexData
import serial ser = serial.Serial( port='/samplePort/ttyUSB1', baudrate=115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout = None ) while 1: print ser.read() hexData= ser.read().hex() print hexData
This function can be used to retrieve the number of bytes in the input buffer .
Return(s) – Integer
Arguments – None
The function out_waiting() performs similarly. It provides the number of bytes in the output buffer.
Here’s an example program implementing the said function.
import serial ser = serial.Serial( port = '/samplePort/myUSB', baudrate = 5000, parity = serial.PARITY_NONE, stopbits = serial.STOPBITS_ONE, bytesize = serial.EIGHTBITS, timeout=0.5, inter_byte_timeout=0.1 ) # Reads one byte of information myBytes = ser.read(1) # Checks for more bytes in the input buffer bufferBytes = ser.inWaiting() # If exists, it is added to the myBytes variable with previously read information if bufferBytes: myBytes = myBytes + ser.read(bufferBytes) print(myBytes)
flush() eliminates the contents of the internal buffer of a file object. It doesn’t take any arguments nor return anything. There are 2 types of flush functions:
import serial ser = serial.Serial('/samplePort/myUSB10') # Clearing Input Buffer ser.flushInput() # Clearing Output Buffer ser.flushOutput() ser.write("get") # Pause for 100 milliseconds sleep(.1) print ser.read()
Arduino is an open-source electronics platform that provides easy-to-use hardware and software. Arduino boards can read inputs from sensors, a finger on a button, or a Twitter message, which they then output in the form of motors, LEDs, or even text.
import serial import time ser = serial.Serial('COM4', 9800, timeout=1) time.sleep(2) for i in range(50): # Reading all bytes available bytes till EOL line = ser.readline() if line: # Converting Byte Strings into unicode strings string = line.decode() # Converting Unicode String into integer num = int(string) print(num) ser.close()
Popular now
For this problem, try renaming your project file to ‘serial.py’. Delete serial.pyc if it exists. After that run import serial .
Furthermore, this problem occurs due to the fact that the package you’re importing has the same name as your project file.
The .read() function only receives one byte at a time. However, we can iterate the function to receive one byte at a time over multiple loops. This is quite redundant. The .readline() will read a complete set of bytes until EOL is achieved.
We learned that with the help of the PySerial Module and Python Serial Read we are able to handle information from devices via Serial Ports.