文章目录[隐藏]
RS-485仅是一个电气标准,描述了接口的物理层,像协议、时序、串行或并行数据以及链路全部由设计者或更高层协议定义。
RS-485定义的是使用平衡(也称作差分)多点传输线的驱动器(driver)和接收器(receiver)的电气特性。
485类型的传感器默认出厂设置地址都为0x01。但是如果我想接多个485传感器,可能地址就冲突了,导致程序无法运行。所以这里以噪音模块为例,我们需要看懂厂家给的文档,如何修改地址。
噪声传感器实验
MR开发板
单片机TTL转RS485模块
接线说明
开发板 | TTL转RS485模块 |
---|---|
A3 | TXD |
A2 | RXD |
5v | 5v+ |
GND | GND |
噪声传感器模块——485信号
接线说明
TTL转RS485模块 | 噪音模块 | 开发板 |
---|---|---|
A+ | TXD_A | |
B- | RXD_B | |
5v | 5V | |
GND | GND |
厂家出厂给的文件重点
基本都是如下格式,会一个,其它传感器都差不多。
数据帧格式定义(非重点,了解一下即可)
采用Modbus-RTU 通讯规约,
格式如下:
初始结构 ≥4 字节的时间
地址码 = 1 字节
功能码 = 1 字节
数据区 = N 字节
错误校验 = 16 位CRC 码
结束结构 ≥4 字节的时间
地址码:默认01。
功能码:主机所发指令功能指示,本模块只用到功能码0x03(读取寄存器数据)。
数据区:数据区是具体通讯数据,注意16bits数据高字节在前!
CRC码:二字节的校验码。
主机问询帧结构:
地址码 | 功能码 | 寄存器起始地址 | 寄存器长度 | 校验码低位 | 校验码高位 |
---|---|---|---|---|---|
1字节 | 1字节 | 2字节 | 2字节 | 1字节 | 1字节 |
模块应答帧结构:
地址码 | 功能码 | 有效字节数 | 数据一区 | 第二数据区 第N数据区 | 校验码 |
---|---|---|---|---|---|
1字节 | 1字节 | 1字节 | 2字节 | 2字节 | 2字节 |
修改地址(重点)
问询帧(假设修改地址为2,再次查询即可发现地址已被修改)
地址码 | 功能码 | 起始地址 | 修改数值 | 校验码低位 | 校验码高位 |
---|---|---|---|---|---|
0xFF | 0x06 | 0x07 0xD0 | 0x00 0x02 | 0x1D | 0x58 |
应答帧
地址码 | 功能码 | 起始地址 | 修改数值 | 校验码低位 | 校验码高位 |
---|---|---|---|---|---|
0x01 | 0x06 | 0x07 0xD0 | 0x00 0x02 | 0x08 | 0x86 |
读取设备的地址以及波特率
问询帧(例如:读取到的地址为0x01 波特率为4800,分别以2400、4800、9600的波特率发送该问询帧)
地址码 | 功能码 | 起始地址 | 数据长度 | 校验码低位 | 校验码高位 |
---|---|---|---|---|---|
0xFF | 0x03 | 0x07 0xD0 | 0x00 0x02 | 0xD1 | 0x58 |
应答帧
地址码 | 功能码 | 有效字节数 | 波特率 | 地址 | 校验码低位 | 校验码高位 |
---|---|---|---|---|---|---|
0x01 | 0x03 | 0x04 | 0x00 0x01 | 0x00 0x01 | 0x6A | 0x33 |
>>> from pyb import UART,delay
>>>
>>> u2 = UART(2, baudrate=9600)
>>>
>>> barray = bytearray([0xFF,0x03,0x07, 0xD0 ,0x00 ,0x02 ,0xD1,0x58])
>>> u2.write(barray)
8
>>> u2by=u2.read()
>>> print(u2by)
b'\x02\x03\x04\x00\x02\x00\x02\xe92' # 地址是2
# 这里是我修改地址成功了然后查询的 默认地址是1
CRC校验
可能大家也注意了,每次发送“命令的时候”都会有一个“校验码低位,校验码高位”这个是什么东西。怎么设置。
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
简单说就是怕数据传错地方,给了一个保障。所以这个CRC校验码不是随便填写的。比如我的噪音传感器地址改成了2,但是我发数据的时候,如果检验不对。是收不到回来的信息的。整个功能就实现不了。
我们的地址改了,但是CRC校验码不对,我们就收不到返回的数据(其实也没传成功。。)
我们使用CRC(循环冗余校验)在线计算工具来修改后面两个校验码。
使用方法
- 点击打开CRC(循环冗余校验)在线计算工具
- 将地址为
0x01,0x03,0x00,0x00,0x00, 0x01 ,0x84 ,0x0A
的信息修改成0x02,0x03,0x00,0x00,0x00, 0x01 ,未知 ,未知
把0x去掉后剩下的信息放到【需要校验的数据】处【参数模型】选择 CRC-16/MODBUS - 点击【计算】
所以我们获得最终的 查询地址2噪音的询问针应该是
0x02,0x03,0x00,0x00,0x00, 0x01,0x84,0x39
测试:地址二获取噪音信息。
版权声明:本文为CSDN博主「咸鱼箘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45020839/article/details/122240898
暂无评论