【python】根据RS485通讯协议,读写数据--完整代码(嵌入式软件自动化测试)

一、通讯连接工具

1.USB转RS485通讯转换器1个
2.PCB线路板1个
3.转换器的AB口与线路板AB口相连,A连接A,B连接B
在这里插入图片描述

二、通讯协议

2.1 数据格式

在这里插入图片描述
根据通讯协议文档,可以看出只需要关注【命令/状态】和【返回数据/参数设置】两列,其他列固定。

2.2 协议指令

1、举例:查询指令
在这里插入图片描述

(1)根据命令/状态表,查询指令为0x02,即D3位为0x02
(2)发送查询指令:FE 0C A5 02 00 00 00 00 00 00 00 00 00 00 DA
(3)返回数据:D4-D6为当前时间的时分秒,D7D8为用水量,D9D10为用水流速。

解释高低字节:
高字节占据高位(左侧),低字节占据低位(右侧)。
例如:高字节是 b’\xfe’,低字节是 b’\x2e’,它们组合成一个 16 位的数值de2e,转换十进制为56878。

计算方法
将高字节左移 8 位: 高字节 << 8。
将低字节加到高字节的结果中: (高字节 << 8) | 低字节。

协议指令测试:
在这里插入图片描述

三、代码实现RS485通讯读写

3.1 完整代码

先附上完整代码:

import serial
import binascii
# 打开串口COM5, 9600波特率, 8数据位, 0停止位
ser = serial.Serial(port='COM5', baudrate=9600, bytesize=8, parity='N', stopbits=1,  # 1.根据实际通讯协议要求,实例化串口及各项参数
                 dsrdtr=False, rtscts=False, xonxoff=False, timeout=2)

# 检查串口是否已经打开
if ser.is_open:
    print('串口已成功打开.')

# 发送的数据包
data_to_send1 = 'FE 0C A5 02 00 00 00 00 00 00 00 00 00 00 DA' #16进制数据
data_to_send1=data_to_send1.replace(' ', '')  # 去除空格
data_to_send=binascii.a2b_hex(data_to_send1)  # 转换为16进制字符串

# 发送16进制字符串
write_len=ser.write(data_to_send)

# 读取数据包, 分字节和功能读取, 数据位为2字节
receive=True
ASSCII_receive_list=[]
while receive:
    receives=ser.read(1) # serial.read() 方法从串口接收到数据是byte字节型,转换要参考 ASCII 与16进制对照表
    if receives == []:
        # 没接受有效数据时,会一直读取到空列表,等于空列表时,利用continue语句再次重新读取
        continue

    elif receives != []:  # 表示当接收数据不等于空列表[]时,将数据存储在列表
        ASSCII_receive_list.append(receives)
        if len(ASSCII_receive_list)==write_len: #读取结束
            print(f'接收到的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试笔记(自看)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值