微机相关的问题求解(1)

1,270 阅读1分钟

启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情

前言:解答别人问题,顺便发文章 微机相关的问题求解
经量是8250,8255,8251这种
二、基于微机系统的串口通信协议设计
任务说明:
编写基于串行接口的主从结构通信协议,通过该协议完成数据的传递。
报文格式定义如下
见图

image.png 还是很简单的,解释都写在注释里面了....

`import serial import time

定义报文头

HEADER_1 = 0x5A HEADER_2 = 0xA5

定义站地址

STATION_ADDRESS = 0x50

定义功能码

FUNCTION_CODE_WRITE = 0x80 FUNCTION_CODE_READ = 0x81

定义地址码

ADDRESS_CODE_HIGH = 0x30 ADDRESS_CODE_LOW = 0x40

定义要写入的数据

DATA_CODE = 0xAA

打开串口

ser = serial.Serial("COM3", 9600)

while True: # 构造读取报文 read_packet = bytearray([HEADER_1, HEADER_2, STATION_ADDRESS, FUNCTION_CODE_READ, ADDRESS_CODE_HIGH, ADDRESS_CODE_LOW, 0x01, 0x00])

# 计算校验码
check_sum = 0
for b in read_packet[:-1]:
    check_sum += b
read_packet[-1] = check_sum

# 发送读取报文
ser.write(read_packet)

# 接收返回报文
response = ser.read(8)

# 解析返回报文
if response[0] == HEADER_1 and response[1] == HEADER_2 and response[2] == STATION_ADDRESS and response[3] == FUNCTION_CODE_READ and response[4] == ADDRESS_CODE_HIGH and response[5] == ADDRESS_CODE_LOW:
    data = response[6]
    check_sum = 0
    for b in response[:-1]:
        check_sum += b
    if check_sum == response[-1]:
        # 返回报文校验通过,输出数据
        print("Read data:", data)
    else:
        # 返回报文校验失败,输出错误信息
        print("Read error: invalid check sum")
else:
    # 返回报文格式错误,输出错误信息
    print("Read error: invalid response format")

# 构造写入报文

write_packet = bytearray([HEADER_1, HEADER_2, STATION_ADDRESS, FUNCTION_CODE_WRITE, ADDRESS_CODE_HIGH, ADDRESS_CODE_LOW, DATA_CODE, 0x00])

计算校验码

check_sum = 0 for b in write_packet[:-1]: check_sum += b write_packet[-1] = check_sum

发送写入报文

ser.write(write_packet)

等待1秒

time.sleep(1) #关闭串口 ser.close()

`