Serial port failure

Rob Amateur.N7TZG at gmail.com
Fri Dec 15 16:52:08 EST 2006


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 ?
> 
> hg




More information about the Python-list mailing list