设备准备
- PC机一个
- 网关一个
- RS-485通信节点三个(三个M3主控模块,一个作为主机,两个从机)
- 火焰传感器一个
- 可燃气体传感器一个
- USB转485调试器一个
一、云平台配置
二、节点固件下载
一路next到……
三、硬件连线
实物连接图
代码分析
// 硬件抽象层初始化 HAL_Init(); // 系统时钟配置 SystemClock_Config(); // GPIO口初始化(包括LED,KEY1,KEY2,蜂鸣器) MX_GPIO_Init(); // 初始化USMART(函数控制管理初始化) usmart_dev.init(); // ADC初始化 MX_ADC1_Init(); // 定时器3初始化 MX_TIM3_Init(); // 初始化内部SRAM my_men_init(SRAMIN); // 初始化modbus16进制 mb_init(M_FRAME_CHECK_CRC16); // 传感器初始化,开机获取上次传感器保存状态 Sensor_Init(); while (1) { // modbus协议应用程序 getsensor_task(); // 获取传感器数值应用程序 app_modbus_slave(); }
void getsensor_task(void) { static uint32_t getsensor_value_time; static uint32_t getsensor_set_time; uint8_t res; if ((uint32_t)(HAL_GetTick() - getsensor_value_time >= 500)) { getsensor_value_time = HAL_GetTick(); //printf("test getsensor_value_time"); // 传递传感器类型获取传感器数据 get_sensor(sen_type_t); } if ((uint32_t)(HAL_GetTick() - getsensor_set_time >= 100)) { getsensor_set_time = HAL_GetTick(); //printf("test change_sensor_state"); res = change_sensor_state(&sen_type_t); } }
void app_modbus_slave(void) { uint8_t res; m_frame_typedef rxframe; static uint32_t slaveaddress_set_time; if (m_ctrl_dev.frameok == 1) { // 解包,判断地址是否是自己的,判断功能吗 // 根据功能码调用相应的函数去读取寄存器的值,封装发给主机 res = mb_unpack_frame(&rxframe); if (res == MR_OK) //解析包成功 { printf("解析包成功\r\n"); } else if (res == MR_FRAME_FORMAT_ERR) { printf("帧格式错误\r\n"); } else if (res == MR_FRAME_CHECK_ERR) { printf("帧校验错误\r\n"); } else if (res == MR_FRAME_SLAVE_ADDRESS) { printf("从机地址错误\r\n"); } else if (res == MR_FRANE_ILLEGAL_FUNCTION) { printf("功能码错误\r\n"); } } // 配置节点地址 if ((uint32_t)(HAL_GetTick() - slaveaddress_set_time >= 100)) { slaveaddress_set_time = HAL_GetTick(); //printf("slaveaddress_set_time\r\n"); change_address_state(&SLAVE_ADDRESS); } }
程序流程