Python work with serial

Using Serial Read or Readline Functions in Python

This article discusses how to read data from serial ports using serial.read() and serial.readline() functions on the pyserial library. Before we do that, however, let us cover some prerequisites.

Prerequisites

We must take care of two things before interacting with serial ports on your device.

First of all, we need to install the Python library to use. The package is called pyserial, which can be installed from the PyPI repository using pip by running the command:

Secondly, we need to identify the serial ports available on the device. We can do this using serial.tools (which is part of the pyserial library but needs to be imported separately). The serial device name can then be found using the .device method. Here is the code.

COM3 - Intel(R) Active Management Technology - SOL (COM3) COM3

You can also run serial.tools.list_ports as a module to get the list of serial ports. That can be done by running the following line on the command line.

You can also locate serial devices outside Python. If you are working with Linux or Mac, serial ports are named /dev/tty*, whereas on Windows, the ports are located on the Ports item on Devices Manager (Go to Start and search for “Device Manager” and find the Ports on the list).

Reading Data from a Serial Port

Once you have identified the active ports, we can choose the one we want to read from. Let’s assume we want to read from COM4 serial port using read() and readline() functions.

Reading serial device using serial.read()

Let’s see an example with comments to break down each line.

The timeout argument in serial.Serial() is set to 1 in the code above. That means that ser.read() will be timed out after 1 second and returns bytes that have been fetched until then.

If we set timeout=None, then the ser.read() will wait forever/until the requested bytes of data is retrieved. You can request a specific number of bytes by changing the line x=ser.read() into something like this to fetch 8 bytes:

You can also use serial object as a context manager as follows.

Using serial.readline() to read information from a serial port

If you are sure that each data piece is terminated with the End of Line character (EOL), you can use serial.readline() to read all bytes until the data piece is terminated by EOL. The new line character “\n” is the default EOL in the pyserial library.

Читайте также:  JSON to HTML Table | Javacodepoint

If data coming in does not have proper EOL character, serial.readline() may run without terminating if a timeout value is not provided.

Be careful when using readline(). Do specify a timeout when opening the serial port otherwise, it could block forever if no newline character is received. Also, note that readlines() only work with a timeout. readlines() depends on having a timeout and interprets that as EOF (end of file).” – Source: documentation.

Источник

pySerial¶

This module encapsulates the access for the serial port. It provides backends for Python running on Windows, OSX, Linux, BSD (possibly any POSIX compliant system) and IronPython. The module named “serial” automatically selects the appropriate backend.

It is released under a free software license, see LICENSE for more details.

Copyright (C) 2001-2020 Chris Liechti

Features¶

  • Same class based interface on all supported platforms.
  • Access to the port settings through Python properties.
  • Support for different byte sizes, stop bits, parity and flow control with RTS/CTS and/or Xon/Xoff.
  • Working with or without receive timeout.
  • File like API with “read” and “write” (“readline” etc. also supported).
  • The files in this package are 100% pure Python.
  • The port is set up for binary transmission. No NULL byte stripping, CR-LF translation etc. (which are many times enabled for POSIX.) This makes this module universally useful.
  • Compatible with io library
  • RFC 2217 client (experimental), server provided in the examples.

Requirements¶

  • Python 2.7 or Python 3.4 and newer
  • If running on Windows: Windows 7 or newer
  • If running on Jython: “Java Communications” (JavaComm) or compatible extension for Java

For older installations (older Python versions or older operating systems), see older versions below.

Installation¶

This installs a package that can be used from Python ( import serial ).

To install for all users on the system, administrator rights (root) may be required.

From PyPI¶

pySerial can be installed from PyPI:

python -m pip install pyserial 

Using the python / python3 executable of the desired version (2.7/3.x).

Developers also may be interested to get the source archive, because it contains examples, tests and the this documentation.

From Conda¶

pySerial can be installed from Conda:

conda install pyserial or conda install -c conda-forge pyserial 

Currently the default conda channel will provide version 3.4 whereas the conda-forge channel provides the current 3.x version.

From source (zip/tar.gz or checkout)¶

Download the archive from http://pypi.python.org/pypi/pyserial or https://github.com/pyserial/pyserial/releases. Unpack the archive, enter the pyserial-x.y directory and run:

Using the python / python3 executable of the desired version (2.7/3.x).

Packages¶

There are also packaged versions for some Linux distributions:

  • Debian/Ubuntu: “python-serial”, “python3-serial”
  • Fedora / RHEL / CentOS / EPEL: “pyserial”
  • Arch Linux: “python-pyserial”
  • Gentoo: “dev-python/pyserial”

Note that some distributions may package an older version of pySerial. These packages are created and maintained by developers working on these distributions.

References¶

Older Versions¶

Older versions are still available on the current download page or the old download page. The last version of pySerial’s 2.x series was 2.7, compatible with Python 2.3 and newer and partially with early Python 3.x versions.

Читайте также:  Java net socketexception broken pipe write failed

pySerial 1.21 is compatible with Python 2.0 on Windows, Linux and several un*x like systems, MacOSX and Jython.

On Windows, releases older than 2.5 will depend on pywin32 (previously known as win32all). WinXP is supported up to 3.0.1.

© Copyright 2001-2020, Chris Liechti Revision 31fa4807 .

Versions latest stable Downloads pdf html epub On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.

Источник

Short introduction¶

Open port at “38400,8,E,1”, non blocking HW handshaking:

>>> ser = serial.Serial('COM3', 38400, timeout=0, . parity=serial.PARITY_EVEN, rtscts=1) >>> s = ser.read(100) # read up to one hundred bytes . # or as much is in the buffer 

Configuring ports later¶

Get a Serial instance and configure/open it later:

>>> ser = serial.Serial() >>> ser.baudrate = 19200 >>> ser.port = 'COM1' >>> ser Serial(port='COM1', baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=0, rtscts=0) >>> ser.open() >>> ser.is_open True >>> ser.close() >>> ser.is_open False 
with serial.Serial() as ser: ser.baudrate = 19200 ser.port = 'COM1' ser.open() ser.write(b'hello') 

Readline¶

readline() reads up to one line, including the \n at the end. Be careful when using readline() . Do specify a timeout when opening the serial port otherwise it could block forever if no newline character is received. If the \n is missing in the return value, it returned on timeout.

readlines() tries to read “all” lines which is not well defined for a serial port that is still open. Therefore readlines() depends on having a timeout on the port and interprets that as EOF (end of file). It raises an exception if the port is not opened correctly. The returned list of lines do not include the \n .

Both functions call read() to get their data and the serial port timeout is acting on this function. Therefore the effective timeout, especially for readlines() , can be much larger.

Do also have a look at the example files in the examples directory in the source distribution or online.

The eol parameter for readline() is no longer supported when pySerial is run with newer Python versions (V2.6+) where the module io is available.

EOL¶

To specify the EOL character for readline() or to use universal newline mode, it is advised to use io.TextIOWrapper:

import serial import io ser = serial.serial_for_url('loop://', timeout=1) sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser)) sio.write(unicode("hello\n")) sio.flush() # it is buffering. required to get the data out *now* hello = sio.readline() print(hello == unicode("hello\n")) 

Testing ports¶

Listing ports¶

python -m serial.tools.list_ports will print a list of available ports. It is also possible to add a regexp as first argument and the list will only include entries that matched.

Читайте также:  Java unicode char table

The enumeration may not work on all operating systems. It may be incomplete, list unavailable ports or may lack detailed descriptions of the ports.

Accessing ports¶

pySerial includes a small console based terminal program called serial.tools.miniterm . It can be started with python -m serial.tools.miniterm (use option -h to get a listing of all options).

© Copyright 2001-2020, Chris Liechti Revision 31fa4807 .

Versions latest stable Downloads pdf html epub On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.

Источник

Short introduction¶

Open port at “38400,8,E,1”, non blocking HW handshaking:

>>> ser = serial.Serial('COM3', 38400, timeout=0, . parity=serial.PARITY_EVEN, rtscts=1) >>> s = ser.read(100) # read up to one hundred bytes . # or as much is in the buffer 

Configuring ports later¶

Get a Serial instance and configure/open it later:

>>> ser = serial.Serial() >>> ser.baudrate = 19200 >>> ser.port = 'COM1' >>> ser Serial(port='COM1', baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=0, rtscts=0) >>> ser.open() >>> ser.is_open True >>> ser.close() >>> ser.is_open False 
with serial.Serial() as ser: ser.baudrate = 19200 ser.port = 'COM1' ser.open() ser.write(b'hello') 

Readline¶

Be careful when using readline() . Do specify a timeout when opening the serial port otherwise it could block forever if no newline character is received. Also note that readlines() only works with a timeout. readlines() depends on having a timeout and interprets that as EOF (end of file). It raises an exception if the port is not opened correctly.

Do also have a look at the example files in the examples directory in the source distribution or online.

The eol parameter for readline() is no longer supported when pySerial is run with newer Python versions (V2.6+) where the module io is available.

EOL¶

To specify the EOL character for readline() or to use universal newline mode, it is advised to use io.TextIOWrapper:

import serial import io ser = serial.serial_for_url('loop://', timeout=1) sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser)) sio.write(unicode("hello\n")) sio.flush() # it is buffering. required to get the data out *now* hello = sio.readline() print(hello == unicode("hello\n")) 

Testing ports¶

Listing ports¶

python -m serial.tools.list_ports will print a list of available ports. It is also possible to add a regexp as first argument and the list will only include entries that matched.

The enumeration may not work on all operating systems. It may be incomplete, list unavailable ports or may lack detailed descriptions of the ports.

Accessing ports¶

pySerial includes a small console based terminal program called serial.tools.miniterm . It can be started with python -m serial.tools.miniterm (use option -h to get a listing of all options).

© Copyright 2001-2020, Chris Liechti Revision 0e763474 .

Versions latest stable Downloads pdf html epub On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.

Источник

Оцените статью