【问题标题】:Sending binary data over a serial connection with pyserial使用 pyserial 通过串行连接发送二进制数据
【发布时间】:2013-05-20 23:21:46
【问题描述】:

我想先说明我现在真的迷路了,所以我说的有些话可能没有意义,因为我不知道我在说什么。只要有帮助,请随时剖析我的问题。

好的,所以我正在进行的整个项目是用 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 的东西?我真的很喜欢一个例子来展示连接、写入和读取到/从串行端口的整个过程。

【问题讨论】:

  • 是的,struct 模块就是您所需要的。

标签: python binary serial-port pyserial atmega


【解决方案1】:

类似

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")

其中&lt; 指定小端字节顺序,c 是单个字符,i 是 32 位整数。

【讨论】:

  • 这看起来很有希望!我会在几个小时后开始工作时通知你。
  • 是的!它工作得很好!这是我用于将来参考的内容:con.write(struct.pack('&lt;cii','d',address,length)data = con.read(33)data = struct.unpack('&lt;ci3h6b8h',data) 然后data[x] 访问元组中的任何特定元素。非常感谢!
  • 由于某种原因,双倍行距没有给我换行... :(
猜你喜欢
  • 1970-01-01
  • 2017-08-22
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
相关资源
最近更新 更多