Serial port failure

Rob Amateur.N7TZG at gmail.com
Fri Dec 15 17:12:36 EST 2006


I have been modifying the code today, tracing through it and trying to
make it more robust and implement data hiding.  That way as someone
reads through my main they will see intuitively what I am doing.   For
that reason I went back and added a filename parameter to OpenPort.

The reason I am closing and opening the port is the same reason I
posted.  I thought that by opening and closing the port each time (I
don't do it in the 'real' code, I could determine whether the bug lay
with hardware or software, or in the USB to Serial adapter.

Rob

On Dec 15, 3:02 pm, hg <h... at nospam.org> wrote:
> Rob wrote:
> > Here is OpenPort
>
> > ####################################################################
> > #### OpenPort procedure
> > ####################################################################
> > def OpenPort(name):
> >     BRate = 19200
> >     Tout  = 3
>
> >     try:
> >         # Initialize the port
> >         p = serial.Serial(name)
> >     # handle failures gracefully
> >     except SerialException:
> >         print "The serial port is unavailable."
> >         print "Disconnect your USB to Serial adapter, Then"
> > print "reconnect it and try again."
> >         sys.exit(1)
>
> >     p.setBaudrate(19200)
> >     p.setTimeout(3)  #set timeout to 1.5 seconds
>
> >     # finish opening the port and assign a file handle
> >     p.open()
> >     return p
>
> > On Dec 15, 1:07 pm, hg <h... at nospam.org> wrote:
> >> Rob wrote:
> >> > Hi all,
>
> >> > I am fairly new to python, but not programming and embedded.  I am
> >> > having an issue which I believe is related to the hardware, triggered
> >> > by the software read I am doing in pySerial.  I am sending a short
> >> > message to a group of embedded boxes daisy chained via the serial port.
> >> >  When I send a 'global' message, all the connected units should reply
> >> > with their Id and Ack in this format '0 Ack'  To be certain that I
> >> > didn't miss a packet, and hence a unit, I do the procedure three times,
> >> > sending the message and waiting for a timeout before I run through the
> >> > next iteration.  Frequently I get through the first two iterations
> >> > without a problem, but the third hangs up and crashes, requiring me to
> >> > remove the Belkin USB to serial adapter, and then reconnect it.  Here
> >> > is the code:
>
> >> > import sys, os
> >> > import serial
> >> > import sret
> >> > import time
>
> >> > from serial.serialutil import SerialException
> >> > ####################################################################
> >> > #### GetAck Procedure
> >> > ####################################################################
> >> > def GetAck(p):
> >> >     response = ""
>
> >> >     try:
> >> >         response = p.readline()
> >> >     except SerialException:
> >> > print ">>>>>Timed out<<<<<"
> >> > return -1
> >> >     res = response.split()
>
> >> >     #look for ack in the return message
> >> >     reslen = len(response)
> >> >     if reslen > 5:
> >> >         if res[1] == 'Ack':
> >> > return res[0]
> >> > elif res[1] == 'Nak':
> >> > return 0x7F
> >> > else:
> >> > return -1
>
> >> >>>>>> Snip <<<<<<
> >> > ####################################################################
> >> > #### GetNumLanes Procedure
> >> > ####################################################################
> >> > def GetNumLanes(Lanes):
> >> > print "Looking for connected units"
> >> > # give a turn command and wait for responses
> >> > msg = ".g t 0 336\n"
>
> >> > for i in range(3):
> >> > port = OpenPort()
> >> > time.sleep(3)
> >> > print port.isOpen()
> >> > print "Request #%d" % (i+1)
> >> > try:
> >> > port.writelines(msg)
> >> > except OSError:
> >> > print "Serial port failure.  Power cycle units"
> >> > port.close()
> >> > sys.exit(1)
>
> >> >             done = False
> >> > # Run first connection check
> >> > #Loop through getting responses until we get a -1 from GetAck
> >> >             while done == False:
> >> > # lane will either be -1 (timeout), 0x7F (Nak),
> >> > # or the lane number that responded with an Ack
> >> > lane = GetAck(port)
> >> > if lane >= '0':
> >> >                     if False == Lanes.has_key(lane):
> >> >                         Lanes[lane] = True
> >> > else:
> >> > done = True
> >> > port.close()
> >> > time.sleep(3)
>
> >> > # Report number of lanes found
> >> >         NumLanes = len(Lanes)
> >> > if NumLanes == 1:
> >> >     print "\n\nFound 1 unit connected"
> >> > else:
> >> >     print "\n\nFound %d units connected" % NumLanes
>
> >> > return NumLanes
>
> >> >>>>>>> Snip <<<<<<
> >> > ####################################################################
> >> > #### Main Program Code Section
> >> > ####################################################################
>
> >> > #open the serial port
> >> > # capture serial port errors from trying to open the port
>
> >> > port = OpenPort()
>
> >> > # If we got to here, the port exists.  Set the baud rate and timeout
> >> > values
>
> >> > # I need to determine how many lanes are on this chain
> >> > # First send a turn command
>
> >> > #Create a dictionary of lanes so I can check each lane's responses
> >> > Lanes = {}
> >> > #<><><><><><><><><><><><><><><><>
> >> > # Call the lane finder utility
> >> > NumLanes = GetNumLanes(Lanes)
> >> > #<><><><><><><><><><><><><><><><>
>
> >> > #if no lanes responded, exit from the utility
> >> > if 0 == NumLanes:
> >> >     print "I can't find any units connected."
> >> >     print "Check your connections and try again"
> >> >     sys.exit(1)
>
> >> > # list the lanes we have in our dictionary
> >> > for n in Lanes:
> >> >     print "Lane - %s" % n
>
> >> > Now, here is the error message that I get
>
> >> > dad at nb29:~/py$ ./Thex.py
> >> > Looking for connected units
> >> > True
> >> > Request #1
> >> > True
> >> > Request #2
> >> > Serial port failure.  Power cycle units
> >> > dad at nb29:~/py$ ./Thex.py
> >> > The serial port is unavailable.
> >> > Disconnect your USB to Serial adapter, Then
> >> > reconnect it and try again.
> >> > dad at nb29:~/py$
>
> >> > Does anyone have any ideas?
>
> >> > Thanks,
>
> >> > rob < Amateur.N7... at gmail.com >Where is OpenPort ?
>
> >> hgI don't get it: you never pass any parameter to OpenPort
>
> The second thing I wonder about is whether you need to reinit serial every
> time .
> 
> hg




More information about the Python-list mailing list