【问题标题】:Serial protocol issues porting code from C to Python串行协议问题将代码从 C 移植到 Python
【发布时间】:2012-09-20 17:46:18
【问题描述】:

我是 C 和复杂的串行通信的初学者。我将尽力提供有关此问题的所有信息;让我知道我是否应该提供任何额外的帮助。

我正在将串行设备(微操纵器)的通信协议从 C 移植到 Python,以便在我的实验室正在开发的 Python 应用程序中使用。该公司为我们提供了用于与设备交互的小型命令行实用程序的源代码。使用这个逻辑,我们的 Python 模块能够生成正确/相同的数据块,包括 CRC。但是,当 Python 代码发送一个数据块(与 C 代码生成的数据块相同)时,它不会收到设备的响应。使用串行端口监控程序(Free Serial Port Monitor),我注意到 Python 和设备之间的通信在某些情况下与公司提供的实用程序不同。

这是所提供实用程序的日志屏幕截图,它可以正常工作。它显示了一个数据块的发送及其响应,以及第二个数据块的发送和响应的开始。

这是我们的 Python 代码发生的情况的屏幕截图;如您所见,它发送数据块时没有响应。

至于其他可能有用的信息,我使用的是标准 Python 串行库。数据块的结构是 14 个 ASCII 字符,以 STX 开头,以 ETX 结尾。前 8 个数据字符对应函数、地址、值等,后 4 个字符是 CRC。

正如我所说,我在这方面有点菜鸟,我真的不知道从哪里开始。任何可能帮助我解决这个问题的建议或帮助或资源将不胜感激,如果我应该提供任何更具体的信息,请告诉我!

http://reentry.mit.edu/extserialport.c

http://reentry.mit.edu/extserialport.h

【问题讨论】:

  • 也许你应该发布一些你的 C 和 python 代码。也许您没有以相同的方式配置端口。你在使用流量控制吗?此外,没有“标准 Python 串行库”之类的东西。在大多数情况下,人们使用 pyserial。
  • 我在您发送的日志中看到的是原始实用程序在您使用 SOH (0x01) 时使用 STX (0x02) 作为消息符号的开头
  • 啊,在这种情况下,我很可能使用我已经安装的 PySerial。我不知道我是否正在使用流量控制。我已经搞砸了一些配置选项,例如 self.setDsrDtr(True) self.setDTR(True) self.setRTS(0) 作为示例,以使串行监视器上的指示器在何时与指示器匹配C 程序运行(虽然我真的不知道我在这里做什么。)
  • 谢谢 Serge,我会检查一下。
  • 好的@Serge,我又看了一下文件,似乎数据块(.21000000EABC。)的第一个字符是0x02,STX。至于前面的数据,我不知道它是什么,是做什么的,但它不是由数据块代码生成的。是否有可能对于初步通信,起始字符必须设置为 STX?

标签: python serial-port protocols pyserial


【解决方案1】:

我发现 pyserial 提供的 win32serial.py 提供了对 Windows API 串行设置的直接(绑定?),在我逐行复制 C 代码中的设置(包括流控制)之后,这似乎奏效了和RTS。非常感谢@Serge 的时间和帮助!

【讨论】:

    最近更新 更多