RS485传感数据采集例程开发指南
1. 概述
典型的串口通信标准有 RS232 和 RS485,RS232 是全双工点对点的通信,而RS485 是半双工通信(2 线制),可以一点对多点进行组网。本实例实现了RS485主设备功能,遵循RS485传感数据协议,使用RS485子板与RS485风力风向传感器连接,通过串口进行交互,透传获取到的传感器数据。
2. 开发板支持
该例程适用于CB6502M开发板。
3. 工作流程
使用YoC SDK来实现RS485数据透传,APP需要实现:
- 应用初始化
- 配置RS485子板工作参数
- 设置RS485传感协议命令
3.1. 应用初始化
应用入口函数app_main(),主要实现如下功能:
- 创建APP Task
代码分析:
int app_main(int argc, char *argv[])
{
......
/* 板级初始化,各业务模块初始化 */
board_yoc_init();
......
/* 创建APP Task,用于定时轮询RS485从设备,并将数据发送至LinKWAN平台 */
aos_task_new_ext(&task_handle, "app_task", app_task_entry,
NULL, 2048, AOS_DEFAULT_APP_PRI);
return;
}
3.2. APP Task
APP Task主要实现了:
- 注册RS485主设备并定时轮询RS485从设备
代码分析:
void app_task_entry(void *arg)
{
......
/* 注册RS485主设备,指定使用的串口端口号 */
rs485_sensor_register(&g_rs485_config, RS485_UART_ID);
......
while (1) {
......
/* RS485从设备数据采集 */
sensor_check_action();
......
/* 休眠 */
if (time_enter > 0)
aos_msleep(time_enter);
}
}
3.3. RS485数据采集
RS485数据采集需要通过串口外接RS485转换模块,本示例中使用的是UART2,应用程序需要设置正确的波特率和RS485模块状态切换引脚,才能与RS485从设备正常通讯。获取的传感数据可在云端根据相应的数据协议进行解析。
处理流程图如下图所示:
以风力风向传感器为例的代码分析:
static void sensor_check_action(void)
{
/* 风力风向传感器,查询命令 */
char sensor_cmd[] = {0x02,0x03,0x00,0x00,0x00,0x01,0x84,0x39};
char response_cmd[30] = {0};
uint32_t len = sizeof(sensor_cmd);
/* 打开RS485主设备 */
dev_t *dev = rs485_sensor_open_id(DEVICE_RS485_SENSOR_NAME, RS485_UART_ID);
/* 发送查询命令 */
if (rs485_sensor_fetch(dev, sensor_cmd, len, RS485_FETCH_TIMEOUT) == 0) {
......
/* 获取回应数据 */
if (rs485_sensor_getdata(dev, response_cmd, &len) == 0) {
......
}
}
......
/* 关闭RS485主设备 */
rs485_sensor_close(dev);
}
4. 例程运行
以CB6502M开发板为例,示例程序的运行步骤为:
4.1. 接线
- CB6502M开发板J34引脚图
- RS485转换子板接线
RS485转换模块管脚 | 开发板J34 |
---|---|
RO | RXD2 |
RE | PA26 |
DE | |
DI | TXD2 |
VCC | DBG_PWR管脚(电源边上) |
GND | GND |
A | 接传感器A |
B | 接传感器B |
4.2. 编译下载
连接打印串口和调试口
打印串口的串口调试工具配置为:
波特率: 115200, 数据位: 8, 校验位: None, 停止位: 1, 流控: None
使用集成开发环境CDK编译工程文件,然后下载至CB6502M开发板
按RESET按键,复位开发板
串口将打印如下信息
[ 0.335863][I][init ]OS version: 7.0.2
[ 0.368225][D][rs485_demo]Enter APP mode
4.3. 运行结果展示
- RS485从设备回应数据
[ 0.620111][D][rs485_demo]
0x0000: 0x02 0x03 0x02 0x00 0x00 0xfc 0x44
示例中使用的风力风向传感器的数据协议为:
发送数据命令格式:
02 03 00 00 00 01 84 39
02:设备站号
03:命令号,在标准的协议中用于读取内存中数据
00 00:读取数据的开始地址,风向值存在于内存中00 00开始的地址中。
00 01:读取数据个数,风向值在内存中占用一个数据空间,Modbus中规定,一个数据数据空间占用2个字节型空间。
84 39:CRC校验值
接收命令格式解析:
02 03 02 01 45 3C 27
02:设备站号。
03:命令号
02:返回数据的长度
01 45:返回的风向值,在Modbus中规定数据的高8位在前,低8位在后,所以(风向值=风向返回值=0145,用户根据实际的返回值可以计算风向值了,此处出现的数字均为16进制)。
3C 27:CRC校验值。