[Tutor] Another parsing question

Alan Gauld alan.gauld at blueyonder.co.uk
Thu Mar 25 02:21:29 EST 2004


> Isn't it just that the serial port tries to behave like a file 
> object. That's fairly normal I think. So do most other byte
> streams that are used in Python, and it's common to transfer
> text over serial lines. Also, a serial port using RS-232 is set 
> up to send chunks of 7 or 8 bits, which fits 8 bit characters 
> better than integers which are 32 (or 64 if you're lucky) bits 
> wide.

Behaving like a file is one thing, insisting on text is another.
I think it might be the last point thats key, it needs to be an 
8 bit unit so we need to convert the 32 bit int to 4 8 bit chunks.

But normally thats handled by the IO routines...

> I assume that you just send chr(x) where x is your 8 bit
> unsigned integer, and to read, you call ord() on the
> byte you read to convert it to an integer in the range
> 0 to 255.

Yep, thats what I thought initially, then realised thats 
chr() and ord() are just representational issues, its 
exactly the same bit pattern so why should the serial 
port care!

> Files behave like this in Python.
>>> f = file('c:/test.dat', 'wb')
>>> f.write(65)
> Traceback (most recent call last):
>  File "<pyshell#21>", line 1, in -toplevel-
>    f.write(65)
>TypeError: argument 1 must be string or read-only buffer, not int

Which raised alarm bells in my head because what do you do 
if the integer is bigger than 255, or its a float? Converting 
these to string format and back is horribly inefficient. That
sent my off to the docs... where I rediscovered the struct 
module...

To write an integer using struct we can do this:

>>> import struct
>>> f.write(struct.pack('i',42))
>>> f.close
<built-in method close of file object at 0xa04ed60>
>>> f.close()
>>> f = file("bin.bin",'rb')
>>> n = f.read()
>>> n
'*\x00\x00\x00'
>>> i = struct.unpack('i',n)
>>> print i
(42,)
>>>

Its a messy intermediate step but at least you can write binary data 
to a file object. If you know the data is byte sized then using 
chr()/ord() will be the easiest route, if its bigger than a byte 
struct is the way to go. - I never thought I'd be wishing for C's 
ability to cast data types in Python!!!

Alan G.




More information about the Tutor mailing list