• 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("解析包成功
    ");
            }
            else if (res == MR_FRAME_FORMAT_ERR)
            {
                printf("帧格式错误
    ");
            }
            else if (res == MR_FRAME_CHECK_ERR)
            {
                printf("帧校验错误
    ");
            }
            else if (res == MR_FRAME_SLAVE_ADDRESS)
            {
                printf("从机地址错误
    ");
            }
            else if (res == MR_FRANE_ILLEGAL_FUNCTION)
            {
                printf("功能码错误
    ");
            }
        }
        // 配置节点地址
        if ((uint32_t)(HAL_GetTick() - slaveaddress_set_time >= 100))
        {
            slaveaddress_set_time = HAL_GetTick();
            //printf("slaveaddress_set_time
    ");
            change_address_state(&SLAVE_ADDRESS);
        }
    }

    程序流程

     

     

  • 相关阅读:
    计算机网络
    计算机网络知识总结
    final,static,super,this
    ArrayList
    基础面试题
    BATJ都爱问的多线程面试题
    Session过期、失效时间
    类加载器ClassLoader源码解析
    连接ftp服务器 JDK 1.7
    根据当前请求的特征,判断该请求是否来自手机终端
  • 原文地址:https://www.cnblogs.com/jsit-dj-it/p/11978305.html
Copyright © 2020-2023  润新知