使用python发送十六进制串行

use*_*192 4 python usb hex rs485

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

我通过电脑中的usb端口将电缆连接到PC和逆变器之间的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()
Run Code Online (Sandbox Code Playgroud)

逆变器使用Danfoss ComLynx协议(第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
Run Code Online (Sandbox Code Playgroud)

Vor*_*ung 5

将"thestring"重写为

thestring = "\x7E\xFF\x03\x00\x01\x00\x02\x0A\x01\xC8\x04\xD0\x01\x02\x80\x00\x00\x00\x00\x8E\xE7\z7E"
Run Code Online (Sandbox Code Playgroud)

你不需要打包它,你可以说data = thestring并发送它.这仅在文档中的各种ID与设备上的ID完全匹配时才有效

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

  • 我相信是的,我当时错过了它,而你是十年来第一个注意到它并发表评论的人:) (2认同)