使用pyserial与空调控制器通信

Communicating with air-conditioner controller using pyserial

我正在尝试第一次通过串口发送和接收信息。可以找到我尝试与之通话的设备的手册 here。我正在尝试开始发送一组十六进制数来询问系统的状况,我的目的是实时询问温度并存储它。到目前为止,我的代码是这样的:

import serial
import time

#import serial.tools.list_ports
#ports = list(serial.tools.list_ports.comports())
#for p in ports:
#    print p

ser = serial.Serial(port= '/dev/ttyUSB0',
baudrate=9600,
parity=serial.PARITY_EVEN,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS, timeout=0, xonxoff=1, rtscts=1, dsrdtr=1)    

command = "\x10\xFF\x29\x2C\x16"
command = command.decode("hex")
ser.write(command)
print command
#time.sleep(10)
ReceivedData = "\n nothing"
while ser.inWaiting() > 0:
    ReceivedData = ser.read()
print ReceivedData

问题是我无法得到任何回应。

编辑: 所以我解决了通讯问题。原来我使用的是延长线,所以 T 和 R 通道没有正确连接。现在,我收到的响应是“\x00\x10\xFF\x29\x2C\x16”,这与我在前面仅输入 \x00 时的响应相同。这是否意味着这是一条错误消息?我如何计算第 4 位?到目前为止,我一直在使用手册中的示例。

不要使用 command = command.decode("hex")

command = "\x10\xFF\x29\x2C\x16"
ser.write(command)

应该可以工作,我确定它需要这样的字节

换句话说

START_BYTE = "\x10"
ADDR_BYTE = "\xff"
FN_BYTE = "\x29"
CS_BYTE = "\x2C" # We assume you have calculated this right
END_BYTE = "\x16"

msg = START_BYTE+ADDR_BYTE+FN_BYTE+CS_BYTE+END_BYTE
ser.write(msg)

你可以抽象出来,因为开始和结束以及地址总是相同的

def send_fn(ser,FN_CMD):
    START_BYTE = "\x10"
    ADDR_BYTE = "\xff"   
    END_BYTE = "\x16"
    CS_BYTE = chr((ord(ADDR_BYTE) + ord(FN_CMD))&0xFF)
    msg = START_BYTE+ADDR_BYTE+FN_CMD+CS_BYTE+END_BYTE
    ser.write(msg)