启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情
前言:解答别人问题,顺便发文章
微机相关的问题求解
经量是8250,8255,8251这种
二、基于微机系统的串口通信协议设计
任务说明:
编写基于串行接口的主从结构通信协议,通过该协议完成数据的传递。
报文格式定义如下
见图
还是很简单的,解释都写在注释里面了....
`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()
`