python - 使用 python 通过串行发送十六进制

标签 python usb hex rs485

这个周末我要做一个小项目。有一个太阳能电池逆变器(丹佛斯 ULX 3600i),我将尝试连接到我的 linux 机器,看看我是否可以从中获取数据,例如统计数据产生了多少能量。上面有一个RJ45连接的输入,但是用的是RS485。

我通过电脑上的 USB 端口使用电脑和逆变器之间的 RS485 转换器连接电缆。

然后我正在编写一个小的 python 代码来发出请求。但是我不知道如何正确发送数据。

import serial
import struct

ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=19200,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)

print(ser.isOpen())
thestring = "7E FF 03 00 01 00 02 0A 01 C8 04 D0 01 02 80 00 00 00 00 8E E7 7E"
data = struct.pack(hex(thestring))
#data = struct.pack(hex, 0x7E, 0xFF, 0x03, 0x00, 0x01, 0x00, 0x02, 0x0A, 0x01, 0xC8,      0x04, 0xD0, 0x01, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x8E, 0xE7, 0x7E)

ser.write(data)
s = ser.read(1)
print(s)
ser.close()

逆变器使用 Danfoss ComLynx 协议(protocol)(在 page 26 上是我要发送的数据):

编辑: 我现在可以发送请求,因为 Adam 4520 RS485 转换器上的 LED 灯闪烁一次,但没有返回数据,但是当我在终端中执行 CTRL+C 时出现此错误:

dontommy@dtbeast:~/workspace/python_scripting/src$ ./sollar.py 
True
^CTraceback (most recent call last):
  File "./sollar.py", line 30, in <module>
    s = ser.readline().decode('utf-8')
  File "/usr/local/lib/python3.2/dist-packages/serial/serialposix.py", line 446, in read
    ready,_,_ = select.select([self.fd],[],[], self._timeout)
KeyboardInterrupt

最佳答案

将“thestring”重写为

thestring = "\x7E\xFF\x03\x00\x01\x00\x02\x0A\x01\xC8\x04\xD0\x01\x02\x80\x00\x00\x00\x00\x8E\xE7\z7E"

你不需要打包,你可以说data=thestring然后发送。这只有在文档中的各种 id 与您设备上的完全匹配时才有效

您需要弄清楚 python “struct” 是如何工作的,如何编码二进制以及如何将两个 4 位值放入一个 8 位字节:线索,请参阅 >>和 << 运算符和结构包“B”格式

关于python - 使用 python 通过串行发送十六进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15570526/

相关文章:

c - 使用 xusb.c 示例代码遇到 libusb 中逻辑 block 地址的偏移量?

c - 如何以特定方式打印十六进制?

在c中将十六进制数转换为十进制数

python - 为什么我无法获得预期输出 'BBB' ?

ios - 无需越狱即可访问 iOS 文件系统?

python - 如何使用 statsmodels 拟合 ARMAX 模型

Android - 是否可以使用 USB 连接以编程方式将文件从笔记本电脑读取到应用程序中?

c - 拆分字符串并将各个部分转换为十六进制

python - Seaborn fiddle 图与 x 轴标签不对齐

python - 我应该什么时候提交 Django 表单的结果?