C to python conversion

Ivan Illarionov ivan.illarionov at gmail.com
Sun Apr 13 07:56:31 EDT 2008


On Apr 13, 7:58 am, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
wrote:
> En Sat, 12 Apr 2008 07:58:47 -0300, Michele Petrazzo
> <michele.petra... at TOGLIunipex.it> escribió:
>
>
>
> > Hi all,
> > I'm trying to translate a simple C code into a python + ctypes (where
> > need), but I have some problems on char conversion. The code have
> > to work on Linux and talk with the serial port. I think that the problem
> > is that I don't translate correctly the strings.
>
> > C code:
> > #define START 0x33
> > #define RETURN_START 0x22
> > #define ADDR 0x01
> > #define WRITE_CMD 0x03
> > #define ALL_CMD 0xFF
> > ...
> > char buf[10];
> > char buf_ret[10];
>
> > buf[0]=0;
> > buf[0]=START;
> > buf[1]=ADDR;
> > buf[2]=WRITE_CMD;
>
> > write(_fd, buf, 6);
> > read(_fd,buf_ret,6);
>
> You don't even need ctypes. In C, `char` is a small integer: 'A' and the
> number 65 are interchangeable. In Python, there are no chars but strings
> of length 1, which are not the same thing as their ordinal integer.
> The easiest way is to define those constants as strings instead:
>
> START = chr(0x33)
> RETURN_START = chr(0x22)
> ADDR = chr(0x01)
> WRITE_CMD = chr(0x03)
> ALL_CMD = chr(0xFF)
> NUL = chr(0)
>
> buf = START + ADDR + WRITE_CMD + NUL + NUL + NUL
> # I assume the buffer was initialized to NULs, because only 3 bytes
> # are filled but 6 bytes are written.
> os.write(_fd, buf)
> buf_ret = os.read(_fd, 6)
>
> --
> Gabriel Genellina

The easiest way is to use struct:

START = 0x33
RETURN_START = 0x22
ADDR = 0x01
WRITE_CMD = 0x03
ALL_CMD = 0xFF

buf = struct.pack('3b3x', START, ADDR, WRITE_CMD)
os.write(_fd, buf)
buf_ret = os.read(_fd, 6)

And, definitely, no need for ctypes here.

--
Ivan Illarionov



More information about the Python-list mailing list