Question about Benchmark_rx.py file code

Hi I’m trying to troubleshoot a piece of code that was handed to me.?
The basic application uses GNU radio and a USRP in transmitting digital
signals and the application uses the following file provided in GNU
radio “benchmark_rx.py” which can be found in the following directory
“gnuradio/trunk/gnuradio-examples/python/digital/benchmark_rx.py”.

The application occasionally crashes on line 66 in the benchmark file,
the line is “(pktno,) = struct.unpack(’!H’, payload[0:2])”.? The error I
get is that struct.unpack should be passed a string of at least size 2

When looking at the code it seems that it should have ‘H’ versus ‘!H’ if
the intend was to convert the object to a C unsigned short object.? And
if the intention is to pass !H then it should be passed as “!H” using
double ? quotes.? when I changed the code to either ‘H’ or “!H” the code
works without any runtime errors.

My question is, is the ‘!H’ a bug in the GNU radio code?? Thanks.

Al Fayez

On Wed, Mar 19, 2008 at 06:02:17PM -0400, [email protected] wrote:

Hi I’m trying to troubleshoot a piece of code that was handed to
me.? The basic application uses GNU radio and a USRP in transmitting
digital signals and the application uses the following file provided
in GNU radio “benchmark_rx.py” which can be found in the following
directory
“gnuradio/trunk/gnuradio-examples/python/digital/benchmark_rx.py”.

The application occasionally crashes on line 66 in the benchmark
file, the line is “(pktno,) = struct.unpack(’!H’, payload[0:2])”.?
The error I get is that struct.unpack should be passed a string of
at least size 2

That means that the code is being handed a string of length < 2 bytes.

When looking at the code it seems that it should have ‘H’ versus
‘!H’ if the intend was to convert the object to a C unsigned short
object.? And if the intention is to pass !H then it should be passed
as “!H” using double ? quotes.? when I changed the code to either
‘H’ or “!H” the code works without any runtime errors.

If you’ll take a look at the python documentation for struct.unpack,
you’ll see that the “!” forces network endian order. That’s what we
want. If you look at the python documentation you’ll discover the
differences between ‘foo’ and “foo” – nothing.

My question is, is the ‘!H’ a bug in the GNU radio code?? Thanks.

Nope.

Eric

Eric B. wrote:

On Wed, Mar 19, 2008 at 06:02:17PM -0400, [email protected] wrote:

The application occasionally crashes on line 66 in the benchmark
file, the line is “(pktno,) = struct.unpack(’!H’, payload[0:2])”.?
The error I get is that struct.unpack should be passed a string of
at least size 2

That means that the code is being handed a string of length < 2 bytes.

Not getting the bug after your changes was probably coincidental. I’ve
seen this happen on occasion when a packet is receive erroneously and
the header is corrupted. The framer state machine looks for the repeated
packet length after correlating with the access code. What’s probably
happening is the header is being read in as double 0’s, so it passes on
a packet of length zero. When unpacking, Python is throwing an
exception.

The right thing to do here is catch the exception and mark it as a
missed packet.

Tom