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 -- http://mail.python.org/mailman/listinfo/python-list