設備准備
- 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); } }
程序流程