我正在尝试第一次通过串口发送和接收信息。我可以找到我试图与之交谈的设备手册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位?到目前为止,我正在使用手册中的一个例子。
答案 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)