我完全不熟悉串行通信,不幸的是,我有一个温度控制器,我想使用 python + pyserial 进行控制。
我设法通过 COM 端口连接到设备。现在我的下一个方法是通过serial.write命令设置新的温度。然而,什么也没有发生。
我的问题:
代码:
import serial
ser = serial.Serial()
ser.baudrate = 9600
ser.port = „COM3“
ser.timeout = 5
ser.stopbits = 1
ser.open()
#Serial<id=0x233e6e2e1a0, open=True>(port=„COM3“, baudrate=9600, bytesize=8, parity=„N“, stopbits=1, timeout=5, xonxoff=False, rtscts=False, dsrdtr=False)
ser.readline()
#b““
ser.write(bytes.fromhex(“01 06 00 00 00 69 49 E4“)) #<—- do i need to add start and stopbits here?
ser.readline()
#b““
到目前为止我尝试过的事情:
首先,我使用串行嗅探器并监控 COM 端口,同时利用制造商的软件来更改温度。嗅探器告诉我将温度更改为 10.5°C 的命令是:01 06 00 00 00 69 49 E4。
此外,嗅探器告诉我,当通过原始软件发送新温度时,它会返回并确认“十六进制代码”:01 06 00 00 00 69 49 E4。
当使用serial.write(bytes.fromhex(01 06 00 00 00 69 49 E4)) python与pyserial并随后使用serial.readline()时,它返回一个空字节。虽然我希望能拿回我的十六进制代码。最终温度设置应在设备显示屏上确认,但事实并非如此。
这是发送字节块以设置新温度的好方法。
import serial
import time
ser = serial.Serial('COM3', 9600, write_timeout=0)
time.sleep(3)
ser.write([0x01, 0x06, 0x00, 0x00, 0x00, 0x69, 0x49, 0xE4])
ser.close()
print("sent")
基本上,您正在发送十六进制字节列表。您不需要更改端口上的任何默认设置,例如停止位等。我在发送数据之前添加了 3 秒的暂停,因为我一直在使用 Arduino 对此进行测试,并且打开端口有不幸的一面 -重启Arduino的效果。所以你可能不需要那条线。