使用pyserial与空调控制器通信

时间:2015-02-18 18:28:26

标签: python serial-port 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位?到目前为止,我正在使用手册中的一个例子。

1 个答案:

答案 0 :(得分:1)

请勿使用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)