RS485:智能安防系統案例


設備准備

  • PC機一個
  • 網關一個
  • RS-485通信節點三個(三個M3主控模塊,一個作為主機,兩個從機)
  • 火焰傳感器一個
  • 可燃氣體傳感器一個
  • USB轉485調試器一個

 

 

 

 一、雲平台配置

http://www.nlecloud.com/

 

 

 

 

 

二、節點固件下載

 

一路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);
    }
}

程序流程

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM