Read from Serial Port

Neil Benn benn at cenix-bioscience.com
Mon Jan 23 11:13:11 CET 2006


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 : benn at cenix-bioscience.com
Cenix Website : http://www.cenix-bioscience.com




More information about the Python-list mailing list