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 > > [EMAIL PROTECTED]:~/py$ ./Thex.py > Looking for connected units > True > Request #1 > True > Request #2 > Serial port failure. Power cycle units > [EMAIL PROTECTED]:~/py$ ./Thex.py > The serial port is unavailable. > Disconnect your USB to Serial adapter, Then > reconnect it and try again. > [EMAIL PROTECTED]:~/py$ > > Does anyone have any ideas? > > Thanks, > > rob < [EMAIL PROTECTED] >
Where is OpenPort ? hg -- http://mail.python.org/mailman/listinfo/python-list