Python Serial Buffer Size

Tips for reading a serial data stream in Python Posted by Cliff Brake on 2009-01-09| 2 Comments to Read Interfacing with a RS232 serial device is a common task when using Python in embedded applications. Explanation In the Arduino Side, a usual process is followed. Upload the file and see in the serial monitor and the output will be displayed. In the Python side, we will have to write the code, click the Run module and see the output which will be displayed.

Active4 months ago

I have an Arduino connected to my computer running a loop, sending a value over the serial port back to the computer every 100 ms.

I want to make a Python script that will read from the serial port only every few seconds, so I want it to just see the last thing sent from the Arduino.

How do you do this in Pyserial?

Here's the code I tried which does't work. It reads the lines sequentially.

Seanny123
2,9465 gold badges38 silver badges77 bronze badges
GregGreg
18.3k72 gold badges201 silver badges269 bronze badges

10 Answers

Perhaps I'm misunderstanding your question, but as it's a serial line, you'll have to read everything sent from the Arduino sequentially - it'll be buffered up in the Arduino until you read it.

If you want to have a status display which shows the latest thing sent - use a thread which incorporates the code in your question (minus the sleep), and keep the last complete line read as the latest line from the Arduino.

Update:mtasic's example code is quite good, but if the Arduino has sent a partial line when inWaiting() is called, you'll get a truncated line. Instead, what you want to do is to put the last complete line into last_received, and keep the partial line in buffer so that it can be appended to the next time round the loop. Something like this:

Regarding use of readline(): Here's what the Pyserial documentation has to say (slightly edited for clarity and with a mention to readlines()):

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. It depends on having a timeout and interprets that as EOF (end of file).

which seems quite reasonable to me!

Seanny123
2,9465 gold badges38 silver badges77 bronze badges
Vinay SajipVinay Sajip
73.7k8 gold badges136 silver badges151 bronze badges
mtasic85mtasic85
2,9072 gold badges15 silver badges26 bronze badges

These solutions will hog the CPU while waiting for characters.

You should do at least one blocking call to read(1)

...and do the split thing as before.

RufusRufus

You can use ser.flushInput() to flush out all serial data that is currently in the buffer.

After clearing out the old data, you can user ser.readline() to get the most recent data from the serial device.

I think its a bit simpler than the other proposed solutions on here. Worked for me, hope it's suitable for you.

Cezar
45.1k15 gold badges78 silver badges84 bronze badges
user3524946user3524946

This method allows you to separately control the timeout for gathering all the data for each line, and a different timeout for waiting on additional lines.

fja0568fja0568

You will need a loop to read everything sent, with the last call to readline() blocking until the timeout. So:

quamranaquamrana
14.7k8 gold badges43 silver badges55 bronze badges

Slight modification to mtasic & Vinay Sajip's code:

While I found this code quite helpful to me for a similar application, I needed all the lines coming back from a serial device that would send information periodically.

I opted to pop the first element off the top, record it, and then rejoin the remaining elements as the new buffer and continue from there.

I realize that this is not what Greg was asking for, but I thought it was worth sharing as a side note.

Crazy Joe MalloyCrazy Joe Malloy

Using .inWaiting() inside an infinite loop may be problematic. It may hog up the entire CPU depending on the implementation. Instead, I would recommend using a specific size of data to be read. So in this case the following should be done for example:

Peter Mortensen
14.4k19 gold badges88 silver badges117 bronze badges
SrinathSrinath

Too much complications

What is the reason to split the bytes object by newline or by other array manipulations?I write the simplest method, which will solve your problem:

LXSoftLXSoft

Here's an example using a wrapper that allows you to read the most recent line without 100% CPU

bdoubleubdoubleu

Not the answer you're looking for? Browse other questions tagged pythonserial-portarduinopyserial or ask your own question.

Overview

This module encapsulates the access for the serial port. It provides backendsfor Python running on Windows, OSX, Linux, BSD (possibly any POSIX compliantsystem) and IronPython. The module named 'serial' automatically selects theappropriate backend.

  • Project Homepage: https://github.com/pyserial/pyserial
  • Download Page: https://pypi.python.org/pypi/pyserial
Python Serial Buffer Size

BSD license, (C) 2001-2017 Chris Liechti <cliechti@gmx.net>

Documentation

For API documentation, usage and examples see files in the 'documentation'directory. The '.rst' files can be read in any text editor or being converted toHTML or PDF using Sphinx. An HTML version is online athttps://pythonhosted.org/pyserial/

Examples

Examples and unit tests are in the directory examples.

Installation

pip install pyserial should work for most users.

Python Serial Buffer Size Guide

Detailed information can be found in documentation/pyserial.rst.

Python File Buffer

The usual setup.py for Python libraries is used for the source distribution.Windows installers are also available (see download link above).

or

To install this package with conda run:

Python Serial Read Buffer Size

conda install -c conda-forge pyserial

Python Serial Input Buffer Size

conda builds are available for linux, mac and windows.