这个周末我要做一个小项目。有一个solarcell逆变器(丹佛斯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协议(onpage 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
将“字符串”重写为
您不需要打包,可以说data=thestring并发送它。只有当文档中的各种ID与设备上的ID完全匹配时,此操作才有效
您需要了解python“struct”是如何工作的,如何对二进制代码进行编码,以及如何将两个4位值放入一个8位字节中:提示,请参见>;<;运算符和struct pack“B”格式
免责声明:我对python和串行端口编程都很陌生。我知道这是一个很老的问题,可能已经解决了,但我想做我的一部分(我想),也许在这个过程中学习!我知道关于键盘中断问题的第二部分的答案(或者至少我认为我知道)
键盘中断基本上是当用户在程序仍在运行时点击“控制+C”。这使得程序在此时执行的任何一行停止。因此
因为这就是它停止的地方(希望我是对的)为了避免这种情况,你可以用“尝试。。“除了”
这基本上可以帮助你以一种“干净的方式”退出你的程序,希望能有所帮助。
我尝试了许多方案来将我的十六进制字符的命令字符串转换为字节,这些字节在UART的远端被识别为十六进制,然后再确定下面的方案。我选择一次发送一个字节的字符串,因为远端每次处理的字节数不能超过四个,所以无法发送整个字符串。单个十六进制字节的格式与C中的sprintf类似
以下是我在Python 3.4.5窗口中看到的内容。
命令名称:心跳命令
命令字符串:a5a50a0001000003e1b
回复:b'A5A51A 002A00543730317632000000C08201e0a040000e389f86b'
我从未想过要将输出解析成字节,但这是一个很好的补充。
相关问题 更多 >
编程相关推荐