Serial port failure

hg hg at nospam.org
Fri Dec 15 17:02:28 EST 2006


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

I 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