用python串行发送十六进制

用python串行发送十六进制,python,usb,hex,rs485,Python,Usb,Hex,Rs485,这个周末我要做一个小项目。有一台solarcell逆变器(丹佛斯ULX 3600i),我将尝试将其连接到我的linux机器上,看看我是否能从中获取数据,产生了多少能量(如统计数据)。有一个用于RJ45连接的输入,但带有RS485 我用电缆通过电脑的usb端口与电脑和变频器之间的RS485转换器连接 然后我正在编写一个小python代码来发出请求。但是我不知道如何正确发送数据 import serial import struct ser = serial.Serial( port='/

这个周末我要做一个小项目。有一台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()
逆变器使用丹佛斯ComLynx协议(我试图发送的数据):

编辑: 现在,当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
dontommy@dtbeast:~/workspace/python\u scripting/src$。/sollar.py
真的
^CTraceback(最近一次通话最后一次):
文件“/sollar.py”,第30行,在
s=ser.readline().decode('utf-8')
文件“/usr/local/lib/python3.2/dist-packages/serial/serialposix.py”,第446行,已读
准备就绪,u,u=select.select([self.fd],[],self.\u超时)
键盘中断
将“字符串”重写为

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


您需要了解python“struct”是如何工作的,如何对二进制进行编码,以及如何将两个4位值放入一个8位字节:线索,请参阅>和免责声明:我对python和串行端口编程都非常陌生。我知道这是一个非常古老的问题,可能已经解决了,但我想做我的一部分(我猜),也许在这个过程中学习!我知道关于键盘中断的问题的第二部分的答案(或者至少我认为我知道),现在开始

键盘中断基本上是在程序仍在运行时用户点击“Control+C”时发生的。这会使程序在此时执行的任何一行的右边停止。因此

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)

这基本上可以帮助您以一种“干净的方式”退出您的程序。希望这会有所帮助。

我尝试了许多方案,将我的十六进制字符的命令字符串转换为字节,这些字节在UART的远端被识别为十六进制,然后再确定下面的方案。我选择一次发送一个字节的字符串,因为远端一次不能处理超过四个字节,所以我无法发送整个字符串。单个十六进制字节的格式类似于C中的sprintf

import time
import serial
import sys
import binascii
import inspect


# This function takes a command string and sends individual bytes.
# It also reports the response.
def send_command(cmd_name, cmd_string):
    print ("\ncmd_name:", cmd_name)
    print ("cmd_string:", cmd_string)
    cmd_bytes = bytearray.fromhex(cmd_string)
    for cmd_byte in cmd_bytes:
        hex_byte = ("{0:02x}".format(cmd_byte))
        #print (hex_byte)
        ser.write(bytearray.fromhex(hex_byte))
        time.sleep(.100)

    # wait an extra 3 seconds for DISP_ON_CMD
    if cmd_name == "DISP_ON_CMD":
        time.sleep(5.0)
    response = ser.read(32)
    print ("response:", binascii.hexlify(bytearray(response)))
    return

# Code to put processor into factory mode.
comm_init='c4c4'
# Here's the list of command strings, captured as tuples.
# The 16-bit Data and Msg CRCs are calculated via gen_crc.exe.
heart_beat_cmd=      ("HEART_BEAT_CMD",      'a5a50a00010000003e1b')
下面是我在Python3.4.5窗口中看到的内容

指令名称:心跳指令

cmd_字符串:a5a50a00010000003e1b

回复:b'A5A51A002A0543730317632000000C08201E0A040000E389F86B'

我从来没有把输出解析成字节,但这将是一个很好的补充

while True:
    try:
        # your main code here
        break
    except KeyboardInterrupt:
        print("User interrupt encountered. Exiting...")
        time.sleep(3)
        exit()
    except:
        # for all other kinds of error, but not specifying which one
        print("Unknown error...")
        time.sleep(3)
        exit()
import time
import serial
import sys
import binascii
import inspect


# This function takes a command string and sends individual bytes.
# It also reports the response.
def send_command(cmd_name, cmd_string):
    print ("\ncmd_name:", cmd_name)
    print ("cmd_string:", cmd_string)
    cmd_bytes = bytearray.fromhex(cmd_string)
    for cmd_byte in cmd_bytes:
        hex_byte = ("{0:02x}".format(cmd_byte))
        #print (hex_byte)
        ser.write(bytearray.fromhex(hex_byte))
        time.sleep(.100)

    # wait an extra 3 seconds for DISP_ON_CMD
    if cmd_name == "DISP_ON_CMD":
        time.sleep(5.0)
    response = ser.read(32)
    print ("response:", binascii.hexlify(bytearray(response)))
    return

# Code to put processor into factory mode.
comm_init='c4c4'
# Here's the list of command strings, captured as tuples.
# The 16-bit Data and Msg CRCs are calculated via gen_crc.exe.
heart_beat_cmd=      ("HEART_BEAT_CMD",      'a5a50a00010000003e1b')