Re: Serial port failure
- From: "Rob" <Amateur.N7TZG@xxxxxxxxx>
- Date: 15 Dec 2006 20:40:05 -0800
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...@xxxxxxxxx> 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 = Falsewith a string. If you compare string with a number python currently
# 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
returns result you probably don't expect
False-1 >= '0'
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
.
- References:
- Serial port failure
- From: Rob
- Re: Serial port failure
- From: Leo Kislov
- Serial port failure
- Prev by Date: Re: tuple.index()
- Next by Date: Re: Roundtrip SQL data especially datetime
- Previous by thread: Re: Serial port failure
- Next by thread: Re: Serial port failure
- Index(es):
Relevant Pages
|