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('无返回数据')

你可能感兴趣的:(学习Python,python,开发语言,CRC16,串口操作)