使用pyserial通过串行连接发送二进制数据

时间:2013-05-19 10:55:30

标签: python binary serial-port pyserial atmega

我想在前面注意到我现在真的迷失了,所以有些事我说的没有意义,因为我不知道我在说什么。只要它有用,请随时解析我的问题。

好吧,所以我正在研究的整个项目是在python中编写一个程序来与定制的温度控制单元(用this芯片构建)连接,并从数据点的内存缓冲区复制数据存储。

我不是那个编程它的人,我只是在与Arduinos的有限经验(我也是python的新手)。以下是我发送的关于与其交互的命令的一些内容:

#define COMMAND_PING                'p'
//  ->  'p'
//  <-  'p' uuuu
//      uuuu - unique number == 0x03645145

#define COMMAND_GET_RECORD_NUMBER   'i'
//  -> 'i'
//  <- 'i' nnnn
//      nnnn - current record number (not written yet)

#define COMMAND_GET_DATA            'd' //Length to 32-bit boundary
//  ->  'd' ssss llll
//  <-  'd' ddddddd...
//      ssss - starting address (should, but probably don't need to be at 32-byte boundary)
//      llll - data length - this must be a multiplicity of 32
//      ddddddd... - data returned

我可以正常使用con.write('p'),然后使用con.readline()我返回转换为十六进制的\x00\x00pEQd\x03是7045516403(注意发送和返回的值是小端)。

我的问题是'd'命令。我想我需要发送'd'作为一个字符串以及两个32位二进制值,但我不知道该怎么做。我几乎不确定要问的问题,你们给予的任何帮助都会受到高度赞赏。

浏览互联网资源(数小时)我想我可能想要使用struct或类似this之类的东西?我真的很喜欢一个示例,展示了连接,写入和读取串行端口的整个过程。

1 个答案:

答案 0 :(得分:2)

这样的东西
port.write(struct.pack('<cii', 'd', address, length)
d = port.read(1)         #'d' expected
data = port.read(length) #length bytes of data expected
if d != 'd' or len(data) < length:
    raise Exception("Bad response received")

其中<指定little-endian字节顺序,c是单个字符,i是32位int。