Read from Serial Port

C

Casey Bralla

I'd like to read ASCII data from a serial port, but (once again) I'm having
trouble getting started. (Can't seem to find the basic level of docs to
get going <sigh>)

I'd like to use only standard "built-in" modules if possible.

Could somebody offer a simple code-snippet to get me started reading from a
serial port?

Thanks!
 
S

Steve Holden

Casey said:
I'd like to read ASCII data from a serial port, but (once again) I'm having
trouble getting started. (Can't seem to find the basic level of docs to
get going <sigh>)

I'd like to use only standard "built-in" modules if possible.

Could somebody offer a simple code-snippet to get me started reading from a
serial port?
While it isn't built in, the standard solution to these problems is the
excellent "pyserial" module.

Google is your friend, and since pyserial is the first hit on a search
for "python serial port" I would recommend you remember that in future
.... that's why there's no URL in this message : Googling yourself will
help the lesson sink in.

regards
Steve
 
G

Grant Edwards

I'd like to read ASCII data from a serial port, but (once
again) I'm having trouble getting started. (Can't seem to
find the basic level of docs to get going <sigh>)

I'd like to use only standard "built-in" modules if possible.

Then there aren't going to be any "basic level docs" because
it's just not an easy thing to do. You pretty much have to do
exactly what you would do in C. So, for Linux/Unix, study up on
http://www.easysw.com/~mike/serial/serial.html. Then do the
exact same thing in python using the "os" module stuff that
deals with file descriptors and termios. And you'll probably to
use select to impliment a timeout when there's no data:

http://www.python.org/doc/2.4.2/lib/os-fd-ops.html
http://www.python.org/doc/2.4.2/lib/module-termios.html
http://www.python.org/doc/2.4.2/lib/module-select.html

For Win32, you'll have to do all of the nasty Win32
CreateFile() calls and such-like. IMO, It's even uglier than
the Posix termios stuff (though not by much). For example,
CreateFile() takes seven parameters, and none of them default
to useful values (it's places like that where Win32's VMS
heritage comes shining through in a manner that instead of
illumnating anything temporarily blinds you and causes you to
run into a tree).
Could somebody offer a simple code-snippet to get me started
reading from a serial port?

Not using just the built-in modules. There is no such simple
code-snippet. If you want simple use pyserial which handles
all of the tricky bits for you:

http://pyserial.sourceforge.net/

It's not a "built-in" module, but it's what you want to use
unless you already know all the contortions require to do
serial port stuff using Posix or Win32 system calls.

Really.

If you truly, madly, deeply want to use just built-in modules,
then your best bet is to download pyserial and copy the
appropriate platform-specific code. I'll be happy to answer
questions about the Posix parts of it, but I had the portion of
my brain containing Win32 knowledge cauterized.
 
D

Diez B. Roggisch

appropriate platform-specific code. I'll be happy to answer
questions about the Posix parts of it, but I had the portion of
my brain containing Win32 knowledge cauterized.

I'm working on that. Last time I checked there was even some AMIGA
pre-AGA-stuff in there. Which I actually think is cute, but could be
filled with other more useful stuff. Any suggestions for a good
cauterization service?

SCNR,

Diez
 
P

Peter Hansen

Grant said:
Then there aren't going to be any "basic level docs" because
it's just not an easy thing to do. You pretty much have to do
exactly what you would do in C.
For Win32, you'll have to do all of the nasty Win32
CreateFile() calls and such-like. IMO,

And given that win32all is *not* standard and built-in, at least with
the standard distribution, you can't do Win32 at all if you insist on
builtin modules.

But doing so would be unreasonable, and fortunately the OP indicates
that that's just his desire, not a firm requirement, so pyserial it is! :)

-Peter
 
G

Grant Edwards

I'm working on that. Last time I checked there was even some AMIGA
pre-AGA-stuff in there. Which I actually think is cute, but could be
filled with other more useful stuff. Any suggestions for a good
cauterization service?

Yea, um, hmm. Don't remember that either. Sloppy work then, eh?
Just as well.
 
N

Neil Benn

Casey said:
I'd like to read ASCII data from a serial port, but (once again) I'm having
trouble getting started. (Can't seem to find the basic level of docs to
get going <sigh>)

I'd like to use only standard "built-in" modules if possible.

Could somebody offer a simple code-snippet to get me started reading from a
serial port?

Thanks!
Here's some code which should help to get you started, I thought rather
than leaving you in the hands of Google (which is not your friend, no
more than MaccyDs is, as Flavour Flav said - 'Don;t believe the hype'),
this may be helpful :

Here's a bit cut out from my own code using pySerial - some of the
variables are not detailed but you can get the idea :

self.__objSerialPort = serial.Serial(self._dctConnectionParams
['ConnectionID'],
self._dctConnectionParams
['BaudRate'],
self._dctConnectionParams
['DataBits'],
self._dctConnectionParams
['Parity'],
self._dctConnectionParams
['StopBits'],
10000, #TimeOut

int(self._dctConnectionParams
['XONXOFF']),

int(self._dctConnectionParams
['RTSCTS']))

To send data with pyserial, you do this :

self.__objLock.acquire()
try:
try:
self.__objSerialPort.write(pStrMessage)
except StandardError:
self._objCurrentState = self._STATUS_CONSTS.ERROR
raise
else:
self._objCurrentState = self._STATUS_CONSTS.CONNECTED
finally:
self.__objLock.release()

The lock on this isn't needed for single threaded code but I would
recommend making a class which deals with the communication in a
thread-safe manner (the connection and disconnection as well - the above
bit should be in a lock as well).

PySerial doesn't have the concept of Observer patterns to get
message coming back in so you'll have to make a polling thread to
observe the serial port when you want to read data, here's the checking
bit - I'll leave the threading and observers up to you:

def __checkSerial(self):
"""
Checks serial port to see if anything is available to read
"""
self.__objLock.acquire()
try:
try:
intNoChars = self.__objSerialPort.inWaiting()
if intNoChars > 0:
strReceivedString =
self.__objSerialPort.read(intNoChars)
self.fireNewMessage(strReceivedString)
except:
raise
finally:
self.__objLock.release()

PySerial wraps all the platform specific stuff you, so you should
really use that, it behaves fairly well - the only real problem is a
lack of an observer interface but you can solve that as detailed above.
One final thing, don;t forget that RS232 isn't really a standard - it's
more like a rumour :).

Cheers,

Neil

--

Neil Benn
Senior Automation Engineer
Cenix BioScience
BioInnovations Zentrum
Tatzberg 47
D-01307
Dresden
Germany

Tel : +49 (0)351 4173 154
e-mail : (e-mail address removed)
Cenix Website : http://www.cenix-bioscience.com
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,540
Members
45,025
Latest member
KetoRushACVFitness

Latest Threads

Top