Serial port failure

Rob Amateur.N7TZG at gmail.com
Fri Dec 15 23:40:05 EST 2006


Leo,

I like your tuple idea.  I will implement it.  The ack and nak both
have the same format, namely: "Id Ack" or "Id Nak"

rob

On Dec 15, 4:34 pm, "Leo Kislov" <Leo.Kis... at gmail.com> 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':Your GetAck returns either string or number and then you compare it
> with a string. If you compare string with a number python currently
> returns result you probably don't expect
>
> >>> -1 >= '0'
> False
> >>> 0x7f >= '0'False
>
> This is a wart and it will be fixed in python 3.0 (it will raise
> exception) I think you should rewrite GetAck to return a tuple (state,
> lane)
>
> def GetAck(p):
>    response = ""
>
>    try:
>        response = p.readline()
>    except SerialException:
>        print ">>>>>Timed out<<<<<"
>        return 'Timeout', 'NoID'
>    res = response.split()
>
>    #look for ack in the return message
>    reslen = len(response)
>    if reslen > 5:
>        if res[1] == 'Ack':
>            return 'Ack', res[0]
>        elif res[1] == 'Nak':
>            return 'Nak', Does Nak response contain lane id?
>        else:
>            return 'Unknown', 'NoID'
>
> And then instead of
>
> lane = GetAck(port)
> if lane >= '0':
>
> use
> 
> state, lane = GetAck(port)
> if state == 'Ack':
> 
>   -- Leo




More information about the Python-list mailing list