python技巧:自动控制高低温箱,通过串口输入命令,生成16进制字符串,并计算CRC16。
最近有个临时紧急的需求,要每隔5摄氏度测试高低温,因此必须使用脚本实现自动控制温箱。
温箱厂商提供了一个控制APP,是通过串口发命令控制温度,但是我们需要cmd实现自动化。因此,我们通过串口监控抓取了设置温度的字符串,参考了温箱设计文档。在AI的帮助下,快速实现了这个控制脚本。
具体实现如下:这组命令是一串16进制数+CRC16校验。
import serial
import time
import crcmod
def calculate_crc16(data):
# 使用 CRC-16-Modbus 算法
crc16 = crcmod.predefined.Crc('modbus')
crc16.update(data)
# 获取 CRC16 校验码并交换字节顺序(低位在前,高位在后)
crc_bytes = crc16.digest()
return f'{crc_bytes[1]:02X}{crc_bytes[0]:02X}'
def create_hex_string(decimal_number):
# 固定前 8 个字节
fixed_part = '01060000'
# 将十进制数乘以 10 并转换为 2 字节的十六进制
decimal_number *= 10
if decimal_number < 0:
# 计算 16 位补码: (2^16 + decimal_number)
complement = (1 << 16) + decimal_number
else:
complement = decimal_number
hex_part = f'{complement:04X}' # 确保是2个字节,不足补0
# 组合数据进行计算CRC的部分(前10个字节)
data_to_crc = bytes.fromhex(fixed_part + hex_part)
# 计算 CRC16
crc = calculate_crc16(data_to_crc)
# 拼接整个16字节字符串
full_hex_string = fixed_part + hex_part + crc
return full_hex_string
# 指定温度(十进制): 70 或者 -20
decimal_number = -10
result = create_hex_string(decimal_number)
print(result)
# 打开串口 COM2,设置波特率为 9600
with serial.Serial('COM2', 9600, timeout=1) as ser:
# 等待串口稳定
time.sleep(2)
# 设置为温度
data_to_send = bytes.fromhex(result)
# 发送数据
ser.write(data_to_send)
# 读取返回的数据
response = ser.read_all()
# 打印返回的数据(以16进制格式显示)
if response:
print('返回数据:', response.hex())
else:
print('无返回数据')