By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
459,666 Members | 1,544 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 459,666 IT Pros & Developers. It's quick & easy.

Read from Serial Port

P: n/a
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!
--
Casey Bralla
Chief Nerd in Residence
The NerdWorld Organisation
http://www.NerdWorld.org
Jan 21 '06 #1
Share this Question
Share on Google+
6 Replies


P: n/a
Casey Bralla wrote:
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
--
Steve Holden +44 150 684 7255 +1 800 494 3119
Holden Web LLC www.holdenweb.com
PyCon TX 2006 www.python.org/pycon/

Jan 21 '06 #2

P: n/a
On 2006-01-21, Casey Bralla <No****@Nowhere.com> wrote:
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.

--
Grant Edwards grante Yow! I'm losing my
at hair...did it go to
visi.com ATLANTIC CITY??
Jan 21 '06 #3

P: n/a
> 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
Jan 21 '06 #4

P: n/a
Grant Edwards wrote:
On 2006-01-21, Casey Bralla <No****@Nowhere.com> wrote:
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.

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

Jan 21 '06 #5

P: n/a
On 2006-01-21, Diez B. Roggisch <de***@nospam.web.de> wrote:
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?


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

--
Grant Edwards grante Yow! ... A housewife
at is wearing a polypyrene
visi.com jumpsuit!!
Jan 21 '06 #6

P: n/a
Casey Bralla wrote:
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 : be**@cenix-bioscience.com
Cenix Website : http://www.cenix-bioscience.com

Jan 23 '06 #7

This discussion thread is closed

Replies have been disabled for this discussion.