使用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)
我正在尝试第一次通过串口发送和接收信息。可以找到我尝试与之通话的设备的手册 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)