0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

物联网系统中如何实现Modbus主机模式?

jf_94171069 来源:jf_94171069 作者:jf_94171069 2024-09-30 17:18 次阅读

一 概述

RS485通信协议是一种多点通信协议,它允许多个设备在同一总线上进行通信,且每个设备都可以发送和接收数据。RS485通讯协议采用差分信号传输,具有高速、远距离、可靠性强等特点,可实现长距离的数据传输。

RS485信号利用两线之间的电压差来传递逻辑信号,规定当电压差为+2V~+6V时为逻辑“1”,而电压差为-2V~-6V时为逻辑“0”。这种传输方式对于外部干扰有良好的抵抗能力,可实现长距离和高噪声环境下的可靠传输。

RS485通信协议支持半双工通信模式,在同一总线上可以连接多个驱动器接收器,方便建立设备网络。此外,RS485通信协议的接口电平低,不易损坏芯片,电平与TTL电平兼容,方便与TTL电路连接。RS485通信协议是一种适用于工业控制系统和智能家居等领域的通信协议,具有高速、远距离、可靠性强等优点,能够满足大量数据传输的需求,并提高数据传输的效率和实时性。

二 RS485通信的优缺点

1 RS485通信协议优点:

抗干扰性强:RS485采用平衡驱动器和差分接收器的组合,具有抗共模干扰能力,能够抵抗外部干扰,保证通信的稳定性。

传输距离远:RS485最大的通信距离约为1219米,最大传输速率为10Mbps,传输速率与传输距离成反比,可以在较长的距离上进行稳定的数据传输。

通信速率高:RS485的数据最高传输速率为10Mbps,比传统的串口通信协议快得多,可以满足高速数据传输的需求。

支持多设备连接:RS485采用总线式拓扑结构,允许多个设备共享同一通信线路,方便实现设备之间的互连互通。

2 RS485通信协议缺点:

通信速率限制:虽然RS485支持高速数据传输,但随着传输距离的增加,传输速率会受到限制。当传输距离超过一定距离时,需要使用中继器来扩展传输距离。

连接设备数量限制:由于RS485采用总线式拓扑结构,连接的设备数量越多,线路越复杂,因此连接设备数量受到限制。

信号衰减问题:在长距离传输时,由于信号衰减和噪声干扰等原因,可能会出现数据传输错误或丢失的情况。因此,对于长距离传输,需要采取措施来保证数据的准确性和完整性。

三 物理层接口

RS485通信协议的物理层接口包括差分信号传输、DB9或RJ45接口以及信号定义等。

差分信号传输是RS485通信协议的核心技术,通过两个信号线(A线和B线)来传输数据。A线传输数据的正信号,B线传输数据的负信号。这种差分信号的优点是可以抵消干扰信号,提高通信的稳定性。

在物理层接口中,RS485协议使用DB9或RJ45接口进行连接。DB9接口包括A线、B线、地线和控制线等,而RJ45接口则采用水晶头连接方式。

RS485通信协议的物理层还定义了电压、时序、数据速率等参数。标准规定,逻辑1的电压范围为+2V~+6V,逻辑0的电压范围为-6V~-2V。在较长的电缆长度上,接收器接收到的电压可能会降低到+/- 200 mV,但对于RS485仍然是完全可以接受的。RS485通信协议的物理层接口规定了通信协议的核心技术要求,包括差分信号传输、接口标准和信号定义等,以确保数据传输的稳定性和可靠性。

wKgaomb4xeCAdTr9AAGYt5nwc7M260.jpg

四 RS485与Modbus的区别

物联网的从业者,刚应用RS485时,经常会接触到另外一个协议:Modbus协议,它与RS485有什么关系和区别呢?

wKgZomb4xeGAGWd3AAIjPQJoOXk317.jpg

RS485与Modbus的区别主要体现在以下三个方面:

协议性质:RS485是一种物理层通信标准,主要定义了电气特性、信号传输方式和连接方式等,而Modbus是一种通信协议,定义了一种常用的通信格式和规则,用于在主设备和从设备之间进行数据交换。

应用范围:RS485通常用作物理层协议,支持Modbus协议,而Modbus更常用于工业控制领域,是一种通用的通信语言,支持RS485、RS232等串口。

功能特性:RS485具有较长的通信距离、较强的抗干扰能力,支持多点、双向通信,而Modbus支持主从模式,可以实现多个设备之间的数据交换。

所以,RS485和Modbus在协议性质、应用范围和功能特性方面存在明显的区别。在工业控制和智能设备通信领域,二者常常被结合使用,以实现高效、稳定的数据传输。

wKgaomb4xeSAN3clAAKvMjkLbSc493.jpg

四 综述

RS485通信协议在物联网中具有重要的地位和价值。首先,RS485协议是一种可靠、高效的通信协议,适用于多个设备之间的长距离通信,能够满足物联网中大量设备之间数据传输的需求。其次,RS485协议具有抗干扰能力强、传输距离远、支持多设备连接等优点,可以适应复杂的物联网环境,保证数据传输的稳定性和可靠性。此外,RS485协议的传输层协议规定了数据传输的格式和规则,包括数据帧的定义、传输顺序、校验方式等,可以满足物联网中不同应用场景的数据传输需求。

在物联网中,RS485协议被广泛应用于各种领域,如工业控制、智能家居、城市管理、智能交通等。在这些领域中,RS485协议可以实现设备之间的快速、稳定、可靠的数据传输,提高设备的智能化程度和用户体验。例如,在智能家居中,RS485协议可以用于家庭内部的各种设备之间的通信,包括智能电视、智能音响、智能照明、智能安防等,实现设备的互联互通和集中控制。

AIoT星球君:RS485通信协议在物联网中具有重要的地位和价值,它的优点和特性使其成为工业控制系统和智能家居等领域的重要通信方式。通过使用RS485协议,可以实现设备的远程监控和控制,提高设备的智能化程度和用户体验。

五 组件的使用

1 Gitee链接地址

组件位于amaziot_bloom_os_sdklibrariesair_4g_swair_swam_485.c

Gitee源码地址:https://gitee.com/ning./hongdou

Github源码地址:https://github.com/ayumid/hongdou

2 应用层组件功能介绍

提供485串口Modbus实例。实现轮询,并将Modbus RTU 协议数据,转发到服务器。

该组件需要和文件组件组合使用,文件中记录了485总线中哪些设备目前在线等信息

3 代码讲解

dtu_485_task_init

初始化modbus任务

void dtu_485_task_init(void)
{
    OSA_STATUS status = 0;

    /*creat message*/
    status = OSAMsgQCreate(&dtu_485_msgq, "dtu_485_msgq", DTU_485_TASK_MSGQ_MSG_SIZE, DTU_MODBUS_TASK_MSGQ_QUEUE_SIZE, OS_FIFO);
    ASSERT(status == OS_SUCCESS);

    status = OSATaskCreate(&dtu_485_msgq_task_ref, dtu_485_task_stack, DTU_485_TASK_STACK_SIZE, 161, "modbus_task", dtu_modbus_task, NULL);
    ASSERT(status == OS_SUCCESS);
}

dtu_alive_task

检查设备在线情况任务,轮询检查,检查最后一次收到信息和当前时间的时间差,判断是否离线

static void dtu_alive_task(void *ptr)
{
    OSA_STATUS status = 0;
    int i = 0;
    UINT32 timestamp = 0;
//    int id = 0;
    
    DTU_FILE_PARAM_T* dtu_file_ctx = NULL;

    dtu_file_ctx = dtu_get_file_ctx();
    
    while(1)
    {
//        uprintf("%s[%d] timer msgrn", __FUNCTION__, __LINE__);
        //for循环查询列表中哪些指令激活,按照激活指令参数配置 指令
        for(i = 0; i < SW_DTU_NUM_MAX; i++)
        {
            //当前列表第i指令被激活
            if(DTU_MODBUS_ACTIVE == dtu_file_ctx- >modbus.cmd[i].active)
            {
                //获取当前时间
                timestamp = utils_utc8_2_timestamp();
                if(timestamp -  sw_dtu_alive[i].timercv > SW_DTU_TIMEOUT)
                {
                    sw_dtu_alive[i].alive = 0;
                }
                uprintf("%s[%d] slave addr: %d id: %d cmd: 0x%02Xn", __FUNCTION__, __LINE__, dtu_file_ctx->modbus.cmd[i].slave_addr, st_dtu_md.id + 1, dtu_file_ctx->modbus.cmd[i].fn);
            }
        }
        sleep(1);
    }
}

dtu_485_task

485主任务,接收发送485串口数据

static void dtu_485_task(void *ptr)
{
    OSA_STATUS status = 0;
    int ret = 0;
    int i = 0;
//    int id = 0;
    int send_len = 0;
    DTU_MSG_UART_DATA_PARAM_T uart_data = {0};
    uint8_t ctx_send_buf[AGILE_MODBUS_MAX_ADU_LENGTH];
    uint8_t ctx_read_buf[1];
//    uint8_t send[100] = {0};
//    uint8_t recv[100] = {0};
//    uint8_t* temp = NULL;
    DTU_FILE_PARAM_T* dtu_file_ctx = NULL;

    dtu_file_ctx = dtu_get_file_ctx();
    
    agile_modbus_rtu_t ctx_dtu = {0};
    agile_modbus_t *ctx = &ctx_dtu._ctx;
    agile_modbus_rtu_init(&ctx_dtu, ctx_send_buf, sizeof(ctx_send_buf), ctx_read_buf, sizeof(ctx_read_buf));

    dtu_modbus_interval_timer_init();
    st_dtu_md.state = DTU_MODBUS_POOLLING_STATE;

    if(DTU_MODBUS_TYPE_ENABLE == dtu_file_ctx->modbus.config.type)
    {
        dtu_modbus_interval_timer_start();
    }
//#define AGILE_MODBUS_FC_READ_COILS               0x01
//#define AGILE_MODBUS_FC_READ_DISCRETE_INPUTS     0x02
//#define AGILE_MODBUS_FC_READ_HOLDING_REGISTERS   0x03
//#define AGILE_MODBUS_FC_READ_INPUT_REGISTERS     0x04
//#define AGILE_MODBUS_FC_WRITE_SINGLE_COIL        0x05
//#define AGILE_MODBUS_FC_WRITE_SINGLE_REGISTER    0x06
//#define AGILE_MODBUS_FC_READ_EXCEPTION_STATUS    0x07
//#define AGILE_MODBUS_FC_WRITE_MULTIPLE_COILS     0x0F
//#define AGILE_MODBUS_FC_WRITE_MULTIPLE_REGISTERS 0x10
//#define AGILE_MODBUS_FC_REPORT_SLAVE_ID          0x11
//#define AGILE_MODBUS_FC_MASK_WRITE_REGISTER      0x16
//#define AGILE_MODBUS_FC_WRITE_AND_READ_REGISTERS 0x17
    while(1)
    {
        //阻塞1s等待从机回复的数据
        status = OSAMsgQRecv(dtu_modbus_msgq, (void *)&uart_data, DTU_MODBUS_TASK_MSGQ_MSG_SIZE, OSA_SUSPEND);

        if(status == OS_SUCCESS)
        {
            if(DTU_MODBUS_TIMER_INTERVAL_MSG == uart_data.id)
            {
//                uprintf("%s[%d] timer msgrn", __FUNCTION__, __LINE__);
                if(DTU_MODBUS_POOLLING_STATE == st_dtu_md.state)
                {
                    //for循环查询列表中哪些指令激活,按照激活指令参数配置 指令
                    for(i = st_dtu_md.id; i < DTU_MODBUS_CMD_NUM; i++)
                    {
                        //当前列表第i指令被激活
                        if(DTU_MODBUS_ACTIVE == dtu_file_ctx- >modbus.cmd[i].active)
                        {
                            //设置从机地址
                            agile_modbus_set_slave(ctx, dtu_file_ctx->modbus.cmd[i].slave_addr);
                            uprintf("%s[%d] slave addr: %d id: %d cmd: 0x%02Xn", __FUNCTION__, __LINE__, dtu_file_ctx->modbus.cmd[i].slave_addr, st_dtu_md.id + 1, dtu_file_ctx->modbus.cmd[i].fn);
                        }
                        else
                        {
//                            uprintf("%s[%d] none cmd continue i:%d id: %dn", __FUNCTION__, __LINE__, i + 1, st_dtu_md.id);
                            st_dtu_md.id = i + 1;
                            continue;
                        }
                        //根据指令01 来组包
                        if(dtu_file_ctx->modbus.cmd[i].fn == AGILE_MODBUS_FC_READ_COILS)
                        {
                            //组包数据
                            send_len = agile_modbus_serialize_read_bits(ctx, dtu_file_ctx->modbus.cmd[i].reg_addr, dtu_file_ctx->modbus.cmd[i].reg_n_d);
                        }
                        //根据指令02 来组包
                        else if(dtu_file_ctx->modbus.cmd[i].fn == AGILE_MODBUS_FC_READ_DISCRETE_INPUTS)
                        {
                            //组包数据
                            send_len = agile_modbus_serialize_read_input_bits(ctx, dtu_file_ctx->modbus.cmd[i].reg_addr, dtu_file_ctx->modbus.cmd[i].reg_n_d);
                        }
                        //根据指令03 来组包
                        else if(dtu_file_ctx->modbus.cmd[i].fn == AGILE_MODBUS_FC_READ_HOLDING_REGISTERS)
                        {
                            //组包数据
                            send_len = agile_modbus_serialize_read_registers(ctx, dtu_file_ctx->modbus.cmd[i].reg_addr, dtu_file_ctx->modbus.cmd[i].reg_n_d);
                        }
                        //根据指令04 来组包
                        else if(dtu_file_ctx->modbus.cmd[i].fn == AGILE_MODBUS_FC_READ_INPUT_REGISTERS)
                        {
                            //组包数据
                            send_len = agile_modbus_serialize_read_input_registers(ctx, dtu_file_ctx->modbus.cmd[i].reg_addr, dtu_file_ctx->modbus.cmd[i].reg_n_d);
                        }
                        //根据指令05 来组包
                        else if(dtu_file_ctx->modbus.cmd[i].fn == AGILE_MODBUS_FC_WRITE_SINGLE_COIL)
                        {
                            //组包数据
                            send_len = agile_modbus_serialize_write_bit(ctx, dtu_file_ctx->modbus.cmd[i].reg_addr, dtu_file_ctx->modbus.cmd[i].reg_n_d);
                        }
                        //根据指令06 来组包
                        else if(dtu_file_ctx->modbus.cmd[i].fn == AGILE_MODBUS_FC_WRITE_SINGLE_REGISTER)
                        {
                            //组包数据
                            send_len = agile_modbus_serialize_write_register(ctx, dtu_file_ctx->modbus.cmd[i].reg_addr, dtu_file_ctx->modbus.cmd[i].reg_n_d);
                        }
//                        uprintf("%s[%d] find cmdrn", __FUNCTION__, __LINE__);
                        //当前激活id,跳出这次循环
                        break;
                    }
                    st_dtu_md.id++;
//                    uprintf("%s[%d] sendbuf len: %d mdid: %drn", __FUNCTION__, __LINE__, send_len, st_dtu_md.id);
                    if(st_dtu_md.id > DTU_MODBUS_CMD_NUM)
                    {
                        st_dtu_md.id = 0;
                        st_dtu_md.state = DTU_MODBUS_POOLLING_WN_STATE;
                        uprintf("%s[%d] poolling  end", __FUNCTION__, __LINE__);
                        //停止modbus驱动定时器
//                        dtu_modbus_interval_timer_stop();
                        //轮训完毕后,重新开始之前等待时间
//                        dtu_sleep(dtu_file_ctx->modbus.config.delay);
                        //开始modbus驱动定时器
//                        dtu_modbus_interval_timer_start();
                    }
                    else
                    {
//                        uprintf("%s[%d] send md hexrn", __FUNCTION__, __LINE__);
//                        int j = 0;
//                        for(j = 0; j < send_len; j++)
//                        {
//                            uprintf("reg data[%d]: %Xrn", j, ctx- >send_buf[j]);
//                        }
                        //发送数据到串口
                        UART_SEND_DATA(ctx->send_buf, send_len);
                    }
                }
                else if(DTU_MODBUS_POOLLING_WN_STATE == st_dtu_md.state)
                {
                    //for循环查询列表中哪些指令激活,按照激活指令参数配置 指令
                    for(i = st_dtu_md.id; i < DTU_MODBUS_CMD_WN_NUM; i++)
                    {
                        //当前列表第i指令被激活
                        if(DTU_MODBUS_ACTIVE == dtu_file_ctx- >modbus.cmd_wn[i].active)
                        {
                            //设置从机地址
                            agile_modbus_set_slave(ctx, dtu_file_ctx->modbus.cmd_wn[i].slave_addr);
                            uprintf("%s[%d] slave addr: %d id: %d cmd: 0x%02X", __FUNCTION__, __LINE__, dtu_file_ctx->modbus.cmd_wn[i].slave_addr, st_dtu_md.id + 1, dtu_file_ctx->modbus.cmd_wn[i].fn);
                        }
                        else
                        {
//                            uprintf("%s[%d] none cmd continue i:%d id: %dn", __FUNCTION__, __LINE__, i + 1, st_dtu_md.id);
                            st_dtu_md.id = i + 1;
                            continue;
                        }
                        
                        //根据指令0F 来组包
//                        if(dtu_file_ctx->modbus.cmd_wn[i].fn == AGILE_MODBUS_FC_WRITE_MULTIPLE_COILS)
//                        {
//                            uprintf("cmd 0x10 regnum: %drn", dtu_file_ctx->modbus.cmd_wn[i].reg_n_d);
                            //组包数据
//                            send_len = agile_modbus_serialize_write_registers(ctx, dtu_file_ctx->modbus.cmd_wn[i].reg_addr, dtu_file_ctx->modbus.cmd_wn[i].reg_n, (UINT16*)&dtu_file_ctx->modbus.cmd_wn[i].reg_data);
//                            int j = 0;
//                            for(j = 0; j < dtu_file_ctx- >modbus.cmd_wn[i].reg_n_d; j++)
//                            {
//                                uprintf("reg data[%d]: %Xrn", j, dtu_file_ctx->modbus.cmd_wn[i].reg_data[j]);
//                            }
//                        }
                        //根据指令10 来组包
                        if(dtu_file_ctx->modbus.cmd_wn[i].fn == AGILE_MODBUS_FC_WRITE_MULTIPLE_REGISTERS)
                        {
//                            uprintf("cmd 0x10 regnum: %drn", dtu_file_ctx->modbus.cmd_wn[i].reg_n_d);
                            //组包数据
                            send_len = agile_modbus_serialize_write_registers(ctx, dtu_file_ctx->modbus.cmd_wn[i].reg_addr, dtu_file_ctx->modbus.cmd_wn[i].reg_n, (UINT16*)&dtu_file_ctx->modbus.cmd_wn[i].reg_data);
//                            int j = 0;
//                            for(j = 0; j < dtu_file_ctx- >modbus.cmd_wn[i].reg_n_d; j++)
//                            {
//                                uprintf("reg data[%d]: %Xrn", j, dtu_file_ctx->modbus.cmd_wn[i].reg_data[j]);
//                            }
                        }
//                        uprintf("%s[%d] find cmdrn", __FUNCTION__, __LINE__);
                        //当前激活id,跳出这次循环
                        break;
                    }
                    st_dtu_md.id++;
//                    uprintf("%s[%d] sendbuf len: %d mdid: %drn", __FUNCTION__, __LINE__, send_len, st_dtu_md.id);
                    if(st_dtu_md.id > DTU_MODBUS_CMD_WN_NUM)
                    {
                        st_dtu_md.id = 0;
                        st_dtu_md.state = DTU_MODBUS_POOLLING_STATE;
                        uprintf("%s[%d] wn poolling end", __FUNCTION__, __LINE__);
                        //停止modbus驱动定时器
                        dtu_modbus_interval_timer_stop();
                        //轮训完毕后,重新开始之前等待时间
                        dtu_sleep(dtu_file_ctx->modbus.config.delay);
                        //开始modbus驱动定时器
                        dtu_modbus_interval_timer_start();
                    }
                    else
                    {
//                        uprintf("%s[%d] send md hexrn", __FUNCTION__, __LINE__);
//                        int j = 0;
//                        for(j = 0; j < send_len; j++)
//                        {
//                            uprintf("reg data[%d]: %Xrn", j, ctx- >send_buf[j]);
//                        }
                        //发送数据到串口
                        UART_SEND_DATA(ctx->send_buf, send_len);
                    }
                }
            }
            else if(DTU_MODBUS_DATA_MSG == uart_data.id && NULL != uart_data.UArgs)
            {
//                uprintf("%s[%d] modbus res", __FUNCTION__, __LINE__);
//                
//                UINT8* p = uart_data.UArgs;
//                for (i = 0; i < uart_data.len; i++)
//                {
//                    uprintf("0x%02X" , p[i]);
//                }
                
                //如果是modbus数据,判断目前是modbus rtu上报模式,modbus tcp上报模式,还是json上报格式
                if(DTU_MODBUS_RESPONSE_JSON_TYPE == dtu_file_ctx- >modbus.config.res_type)
                {
                    uprintf("modbus json res");
                    dtu_modbus_json_modbus_res(uart_data.UArgs, uart_data.len);
                }
//                else if(DTU_MODBUS_RESPONSE_TCP_TYPE == dtu_file_ctx->modbus.config.res_type)
//                {
//                    //判断是否是modbus一帧数据
//                    ret = dtu_modbus_protocol_check(uart_data.UArgs, uart_data.len);
//                    if(DTU_MODBUS_PROTOCOL_SUCCESS == ret)
//                    {
//                        uprintf("modbus tcp res");
//                    }
//                }
                else
                {
                    uprintf("modbus rtu res");
                    //modbus rtu帧,直接发
#ifdef DTU_BASED_ON_TCP
                    dtu_socket_write(uart_data.UArgs, uart_data.len);
#endif /* ifdef DTU_BASED_ON_TCP.2023-10-31 12:01:18 by: zhaoning */

#ifdef DTU_BASED_ON_MQTT
                    dtu_mqtt_send(uart_data.UArgs, uart_data.len);
#endif /* ifdef DTU_BASED_ON_MQTT.2023-10-31 12:01:28 by: zhaoning */
                }

                //释放数据内存
                free(uart_data.UArgs);
                //置空
                uart_data.UArgs = NULL;

            }
        }
    }
}

dtu_485_interval_timer_init

初始化指令间隔定时器,Modbus轮询过程中每个指令之间的间隔时间

static void dtu_485_interval_timer_init(void)
{
    OSA_STATUS status = 0;
    
    //初始化指令间隔定时器
    status = OSATimerCreate(&st_dtu_md.md_timer_ref);
    ASSERT(status == OS_SUCCESS);
    
}

dtu_485_interval_timer_start

开始指令间隔定时器

void dtu_485_interval_timer_start(void)
{
    DTU_FILE_PARAM_T* dtu_file_ctx = NULL;
    
    dtu_file_ctx = dtu_get_file_ctx();

    OSATimerStart(st_dtu_md.md_timer_ref, dtu_file_ctx->modbus.config.interval * 200, dtu_file_ctx->modbus.config.interval * 200 , dtu_modbus_interval_timer_callback, 0);
}

4 Demo实战

4.1 创建一个Demo

复制20.9_di_xtu示例工程,到同一个文件夹下,修改文件名为20.12_485_air_sw,如图:

wKgaomb4xeeAItUxAACnpKDViEY438.jpg

4.2 修改makefile

增加文件组件所在目录头文件路径,和源文件路径,以及一些宏定义,如图:

-D是makefile中定义宏定义必要的前缀,可以搜索相关makefile学习文章学习相关知识。

DTU_BASED_ON_TCP 表示当前是TCP模式,当前组件使用需要am.h中包含一些对应。

DTU_TYPE_5X6 表示使用SOM板贴片5x6卡,可以使用其它卡,修改为对应宏定义就可以。

DTU_UART_115200_BAUD 表示使用115200波特率

DTU_TYPE_JSON_INCLUDE 表示把JSON功能包含进来

wKgZomb4xeiAeL8MAAFNtSGr-Hs481.jpg

4.3 增加头文件

使用代码编辑器,将新建的工程文件加入代码编辑器中,打开main.c,修改main.c,加入am.h头文件,如图:

wKgaomb4xemAFetzAAAjjDrqVyc848.jpg

4.4 修改代码

示例使用的是板载5x6卡,用户的硬件可能是使用外置卡,或者是三合一全网通卡,因为硬件上三种卡使用的模组SIM卡接口不一样(外置卡SIM1,5x6卡和三合一卡SIM2),所以,需要通过一个全局变量来制定SIM卡硬件接口。

extern外部变量SDK_INIT_SIM_SELECT_VALUE,这里判断了是否使用外置卡,这个宏定义在Makefile里面定义。

wKgZomb4xemAWHDIAAAVMVRfTbM845.jpg

在Phase1Inits_enter中,宏定义判断是否要包含对SDK_INIT_SIM_SELECT_VALUE变量的修改。

wKgaomb4xeqAWF3AAAAhKBe8PfY059.jpg

在Phase2Inits_exit 调用文件组件提供的对外API,如图:

wKgZomb4xeuAHVvnAABqic6_Amk774.jpg

4.5 编译

在SDK根目录打开命令行,输入命令.build.bat -l .amaziot_bloom_os_sdksamplelibraries20.14_modbus_xtu

PS F:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08
λ .build.bat -l .amaziot_bloom_os_sdksamplelibraries20.14_485_air_sw
子目录或文件 outbin 已经存在。
子目录或文件 buildcJSON 已经存在。
子目录或文件 buildobj 已经存在。
gnumake: Entering directory `F:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.14_modbus_xtu'
armcc.exe -c  --cpu Cortex-R4 --no_unaligned_access -g -O2 --apcs /inter --diag_suppress 2084,1,2,177,188,223,550,1296,2795,6319,9931,9933 --diag_error=warning --gnu --thumb --loose_implicit_cast  -DDATA_COLLECTOR_IMPL -DISPT_OVER_SSP -DDIAG_SSP_DOUBLE_BUFFER_USE_DYNAMIC_ALLOCATION -DENV_XSCALE -DL1_DCXO_ENABLED -DLTE_HIGH_MOBILITY_OPTIMIZATION -DRUN_XIP_MODE -DCRANE_Z2 -DCA_LONG_IPC_MSG -DNEZHA3 -DNEZHA3_1826 -DUPGRADE_PLMS -DUPGRADE_PLMS_SR -DLTE_GSMMULTIBCCH -DGPLC_LTE_RSSI_SCAN -DL1V_NEW_RSSI -DUPGRADE_PLMS_3G -DUPGRADE_PLMS_L1 -DUPGRADE_FG_PLMS -DFG_PLMS_URR -DUPGRADE_L1A_FG_PLMS -DUPGRADE_PLMS_STAGE_2 -DUPGRADE_MBCCH -DMULTI_BCCH_READY_IND -DURR_MRAT_ICS_SEARCH -DUPGRADE_ICS -DMRAT_NAS -DUPGRADE_PLMS_SEARCH_API -DICS_MBCCH -DICS_MBCCH_2G_RSSI -DDIAG_NEWPP -DPHS_SW_DEMO -DPHS_SW_DEMO_TTC -DPHS_SW_DEMO_TTC_PM -DFULL_SYSTEM -D_DDR_INIT_ -D_TAVOR_HARBELL_ -DUPGRADE_ARBEL_PLATFORM -D_TAVOR_B0_SILICON_ -DTDL1C_SPY_ENABLE -DDLM_TAVOR -DTAVOR -DFLAVOR_DUALCORE -DDEBUG_D2_MOR_REG_RESEREVED_ENABLE -D_DIAG_USE_COMMSTACK_ -D_TAVOR_DIAG_ -DPM_DEBUG_MODE_ENABLED -DPM_D2FULL_MODE -DPM_EXT_DBG_INT_ARR -DFEATURE_WB_AMR_PS -DMACRO_FOR_LWG -DHL_LWG -DOPTIMIZE_FOR_2G_BCCH -DPLAT_TEST -D_FDI_USE_OSA_ -DPLAT_USE_THREADX -DLWIP_IPNETBUF_SUPPORT -DCRANE_MCU_DONGLE -DAT_OVER_UART -DPHS_SW_DEMO_TTC_PM -DUPGRADE_LTE_ONLY -DEXT_AT_MODEM_SUPPORT -DLTEONLY_THIN_SINGLE_SIM -DLFS_FILE_SYS -DLFS_FILE_SYS_V2 -DPSM_ENABLE -DNO_PAHO_MQTT -DNO_XML -DNO_LWM2M -DREMOVE_MBEDTLS -DNO_AT_NET -DCRANE_SD_NOT_SUPPORT -DNTP -DYMODEM_EEH_DUMP -DENABLE_DM_LTEONLY -DLTEONLY_THIN -DNO_EXTEND_MY_Q_AT -DNOT_SUPPORT_HTTPS -DNOT_SUPPORT_PM813 -DCRANEL_4MRAM -DREMOVE_PB -DUART_NEW_VERSION -DREMOVE_MEP -DREMOVE_SMS -DREMOVE_ENVSIM -DAPN_INCODE -DLTEONLY_THIN_SINGLE_SIM_2MFLASH -DASR160X_OPENCPU_FEATURE -DENABLE_UART3_FEATRUE -DENABLE_UART4_FEATRUE -DYUGE_MBEDTLS_3_2_1 -DENABLE_MAC_TX_DATA_LOGGING -DDISABLE_NVRAM_ACCESS -DINTEL_UPGRADE_EE_HANDLER_SUPPORT -DLTE_W_PS -DL1_DUAL_MODE -DUPGRADE_HERMON_DUAL -DINTEL_UPGRADE_DUAL_RAT -DINTEL_UPGRADE_GPRS_CIPHER_FLUSH -DUPGRADE_ENHANCED_QUAD_BAND -DINTEL_2CHIP_PLAT -DI_2CHIP_PLAT -DUPGRDE_TAVOR_COMMUNICATION -DRUN_WIRELESS_MODEM -DFLAVOR_DDR12MB_GB1MB5 -DFEATURE_SHMEM -DACIPC_ENABLE_NEW_CALLBACK_MECHANISM -DRELIABLE_DATA -DMAP_NSS -DTV_FNAME=""SW_PLATFORM=PMD2NONE PHS_SW_DEMO PHS_SW_DEMO_PM SRCNUCLEUS FULL_SYSTEM NOACRTC PDFLT PLAT_TEST PV2 DIAGOSHMEM NVM WITHL1V"" -DTV_FDESC=""SW_DESCRIPTION="" -DENABLE_ACIPC -D_DATAOMSL_ENABLED_ -DUSB_CABLE_DETECTION_VIA_PMIC -DMIPS_TEST -DMIPS_TEST_RAM -DFLAVOR_DIET_RAM -DNVM_INCLUDE -DMSL_INCLUDE -DMSL_POOL_MEM -DNO_AUDIO -DOSA_QUEUE_NAMES -D_DIAG_DISABLE_USB_ -DOSA_NUCLEUS -DOSA_USED -DPM_D2NONE_MODE -DCRANE_SOC_TEMPERATURE_SENSOR -DL1_SW_UPDATE_FOR_DIGRF -DPHS_L1_SW_UPDATE_R7 -DUPGRADE_LTE -DFRBD_CALIB_NVM -DFRBD_AGC_CALIB -DFRBD_FDT_CALIB -DHSPA_MPR -DCAPT_PARAMS_OPTIMIZE -DL1_WB_R99_ONLY -DL1V_WB_R99_ONLY -DINTERGRATED_RF_SUPPORT -DL1_RX_DIV_SUPPORT -DENABLE_OOS_HANDLING -DTAVOR_D2_WB_L1_SUPPORT -DL1_DDR_HIGH_FREQ -DUPGRADE_DIGRF3G_SUPPORT -DW_PS_PLUS_G_PAGING -D"NO_APLP=0" -DINTEL_UPGRADE_UNIFIED_VOICE_TASK -DINTEL_UPGRADE_R99 -DAPLP_SPY_ENABLE -D__TARGET_FEATURE_DOUBLEWORD -DWHOLE_UMTS_STACK -DUSE_TTPCOM_CSR_BLUETOOTH_AUDIO_GAIN_CONTROL -DL1_UPGRADE_R5 -DUPGRADE_EDGE -DUPGRADE_R4_FS1 -DINTEL_UPGRADE_GSM_CRL_IF -DUPGRADE_EGPRS_M -DINTEL_UPGRADE_EGPRS_M -DINTEL_UPGRADE_RF_PARAMS_IN_CF_TDS -DINTEL_UPGRADE_2SAMPLES_PER_SYMBOL -D"GPRS_MULTISLOT_CLASS=12" -D"EGPRS_MULTISLOT_CLASS=12" -DMARVELL_UPGRADE_BSIC_REDESIGN -DMSL_INCLUDE -DINTEL_HERMON_SAC -DCRANE_CUST_BUILD -DL1_SW_UPDATE_FOR_DIGRF -DFLAVOR_COM -DSILICON_PV2 -DSILICON_SEAGULL -DSILICON_TTC_CORE_SEAGULL -DPCAC_INCLUDE -Otime  -DBUILD_DATE=""11 22 2023"" -DBUILD_TIME=""11:19:00"" -Iatcmdsinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhoptelephonyyugeinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhalUARTinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhalcoreinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhalPMUinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhalGPIOinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xosposixinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xdiagdiag_logicsrc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xcswSysCfginc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xcswplatforminc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xenvwin32inc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xcswBSPinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xcswplatformdev_platbuild -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xososainc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xosthreadxinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xosnu_xscaleinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcacpsminc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcachttpclientsrc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xdiagdiag_logicinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhoptimerinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhopintcinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xcswPMinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhoppminc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xsoftutilTickManagerinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhopBSPinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhoptelephonyatcmdsrvinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhoptelephonyatparserinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhoptelephonysdkinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcachttpclientinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcacciinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcaclwipv4v6srcinclude -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcaclwipv4v6srcincludearch -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcaclwipv4v6srcincludeipv4 -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcaclwipv4v6srcincludeipv6 -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcaclwipv4v6srcincludelwip -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcaclwipv4v6srcincludenetif -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhopmmi_matinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xtavorArbelinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xtavorenvinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhoptelephonymodeminc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcacdusterinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcacfotainc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhalI2Cinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhalACIPCinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xsoftutilfatsysflash -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xsoftutilFDIsrcINCLUDE -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhalMMUinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xsoftutilFDIsrcFDI_ADD -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xsoftutilFDIsrcFM_INC -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xsoftutilfatsysfshdr -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xsoftutillittlefsinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcacttsinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcacdialinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xsoftutilcsw_memoryinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhoputilitiesinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhopcommpminc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xsoftutilnvminc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xsoftutilEEhandlerinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xsoftutilEEhandlersrc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhopRTCinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhoptelephonyci_clientinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhalBT_deviceinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhalUARTinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhopmrdinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhopdmainc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xsoftutilsoftutilinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhalSPIinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcacwebsocketinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcacatnet_srvinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xsoftutilfotacomminc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xaud_swAudioinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xaud_swACM_COMMinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xaud_swaudio_stubsrc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhopaaminc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xaud_swAudioHALinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xhaldbgshellinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08includeasr160xpcacopencpuinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08amaziot_bloom_os_sdkutils -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08CSDK_CODEcJSONinc -IF:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.14_modbus_xtuaminc -IF:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.14_modbus_xtuatcmdsinc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/librariesamxtu -DDTU_BASED_ON_TCP -DDTU_TYPE_5X6 -DDTU_UART_115200_BAUD -DDTU_TYPE_MODBUS_INCLUDE -DDTU_TYPE_JSON_INCLUDE -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/libraries/third_party/agile_modbus-1.1.3inc -IF:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/libraries/third_party/agile_modbus-1.1.3util  -o buildobj/ext_at_cmds.o F:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.14_modbus_xtu/atcmds/src/ext_at_cmds.c
armlink.exe buildobj/main.o buildobj/ext_at_cmds.o buildobj/ext_at_controller.o buildobj/am_file.o buildobj/am_at.o buildobj/am_trans.o buildobj/am_socket.o buildobj/am_hb.o buildobj/am_net.o buildobj/am_json.o buildobj/am_modbus.o buildobj/utils_string.o buildobj/agile_modbus_slave_util.o buildobj/agile_modbus.o buildobj/agile_modbus_rtu.o buildobj/agile_modbus_tcp.o buildCSDK_CODE.lib 
                -o F:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08outbinArbel_PMD2NONE_40M.axf 
                --via F:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08prebuilt_1606lArbel_PMD2NONE_targ_objliblist.txt 
                --elf 
                --scatter F:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08prebuilt_1606lCrane_DS_4M_Ram_2M_Flash_XIP_CIPSRAM_Common_SingleSIM.sct 
                --predefine="-DLTEONLY_THIN_SINGLE_SIM" --map --symbols --info sizes,totals 
                --list F:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08outbinArbel_PMD2NONE_40M.map 
                --keep init.o(Header) --keep init.o(Vectors) --diag_suppress 6312,6314,6319,6329 
                --feedback F:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08outfeedbackLinkOptLteonlyThin_SingleSim_NoSMS.txt
F:3.asr-bcat.1-asr16061.softwareBLOOM_OS_1606_OPENCPU_1191_A08toolsbuildimage_1606l.bat
SDK_PROD_TYPE   : [DM]
SDK_CUST_SKU    : [THIN_SINGLE_SIM_NO_SMS]
SDK_PS_MODE     : [LTEONLY]
SDK_CHIP_VER    : [Z2A0]
SDK_OS_TYPE     : [TX]
Platform Convertion Tools v4.01 with PS option extension
Convertion done!
|INPUT   |outbincp_1606L.bin
|MARK    |NAME    |EXEADDR .LOADADDR.LENGTH  .CPZLADDR|COMPRESS STASTIC              |
|--------|--------|--------.--------.--------.--------|------------------------------|
|This Is LteOnly 4M|
|RW_CPZ_1|DDR_RW_ |7e11c000.8006b8a4.0000d290.8006c000|0000d290->00003000
|This Is LteOnly 4M|
|RW_CPZ_2|PS_NCAH |7e388000.80078b34.00001300.8006f000|00001300->00001000
|This Is LteOnly 4M|
|RW_CPZ_3|ITCM    |7e3dac00.80079e34.0000f51c.80070000|0000f51c->0000a000
|This Is LteOnly 4M|
|RW_CPZ_4|CODE_PS |7e1ad000.80089350.0002fcdc.8007a000|0002fcdc->0001e000
|This Is LteOnly 4M|
|RW_CPZ_5|CODEPSB |7e1df000.800b902c.000339bc.80098000|000339bc->0001b000
|This Is LteOnly 4M|
|RW_CPZ_6|CODEPSC |7e216000.800ec9e8.000323ec.800b3000|000323ec->0001b000
|This Is LteOnly 4M|
|RW_CPZ_7|CODEPSD |7e24c000.8011edd4.00028d88.800ce000|00028d88->0001a000
|This Is LteOnly 4M|
|RW_CPZ_8|CODEPSE |7e27a000.80147b5c.0002e310.800e8000|0002e310->0001a000
|This Is LteOnly 4M|
|RW_CPZ_9|CODEPSF |7e2ac000.80175e6c.0001c948.80102000|0001c948->00011000
|This Is LteOnly 4M|
|RW_CPZ_A|CODE_PL |7e2cd000.801927b4.0002f914.80113000|0002f914->0001e000
|This Is LteOnly 4M|
|RW_CPZ_B|CODEPLB |7e2fd000.801c20c8.00038d38.80131000|00038d38->00021000
|This Is LteOnly 4M|
|RW_CPZ_C|CODEPLC |7e337000.801fae00.000268d4.80152000|000268d4->00012000
|--------|--------|--------.--------.--------.--------|------------------------------|
|                                                     |      0x0020a6d4 -> 0x0014d000|
|                                                     |       2.041(MB) ->  1.301(MB)|
|------------------------------------------------------------------------------------|
cp_1606L.axf
cp_1606L.bin
cp_1606L.map
gnumake: Leaving directory `F:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.14_modbus_xtu'
"copy NEZHAC_CP_CNR_MIFI_TX.bin to ./ "

已复制         1 个文件。

4.6 生成固件

参考入门中开发工具,生成工具。

4.7 查看现象

固件下载到模组后,配置服务器地址,配置Modubs指令,之后用Modbus客户端来模拟查看

[11-22 11:46:54:993]
[11-22 11:46:54:993]OK
[11-22 11:46:56:212]
[11-22 11:46:56:212]AT+TRANSIP="TCP","101.200.35.208",8866
[11-22 11:46:56:212]
[11-22 11:46:56:212]OK
[11-22 11:46:58:042]
[11-22 11:46:58:042]CONNECT OK
[11-22 11:46:59:123]
[11-22 11:46:59:123]AT+MBADD=1,1,1,1,0,10
[11-22 11:46:59:123]
[11-22 11:46:59:123]OK
[11-22 11:46:59:515]
[11-22 11:46:59:515]AT+MBADD=2,1,1,2,0,10
[11-22 11:46:59:515]
[11-22 11:46:59:515]OK
[11-22 11:47:00:287]
[11-22 11:47:00:287]AT+MBADD=3,1,1,3,0,10
[11-22 11:47:00:287]
[11-22 11:47:00:287]OK
[11-22 11:47:00:709]
[11-22 11:47:00:709]AT+MBADD=20,1,1,4,0,10
[11-22 11:47:00:709]
[11-22 11:47:00:709]OK
[11-22 11:47:01:172]
[11-22 11:47:01:172]AT+MBADD=49,1,1,5,0,10
[11-22 11:47:01:172]
[11-22 11:47:01:172]OK
[11-22 11:47:01:669]
[11-22 11:47:01:669]AT+MBADD=50,1,1,6,0,6666
[11-22 11:47:01:669]
[11-22 11:47:01:669]OK
[11-22 11:47:02:336]
[11-22 11:47:02:336]AT+MBADDWN=1,1,1,16,0,5,"16B352A9F615D7D3FE198"
[11-22 11:47:02:336]
[11-22 11:47:02:336]OK
[11-22 11:47:02:937]
[11-22 11:47:02:937]AT+MBCFG=1,1,3,6
[11-22 11:47:02:937]
[11-22 11:47:02:937]OK
wKgaomb4xeyAEiZRAAC99_3GZtk401.jpg

wKgZomb4xe2AJPtyAACmvoFLJQY857.jpg

5 总结

根据实验现象,用户需要实现自己的AT指令,只需要参考组件中的例子,按照自己需求修改,

本文章源自奇迹物联开源的物联网应用知识库Cellular IoT Wiki,更多技术干货欢迎关注收藏Wiki:Cellular IoT Wiki 知识库(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf)

欢迎同学们走进AmazIOT知识库的世界!

这里是为物联网人构建的技术应用百科,以便帮助你更快更简单的开发物联网产品

Cellular IoT Wiki初心:

在我们长期投身于蜂窝物联网 ODM/OEM 解决方案的实践过程中,一直被物联网技术碎片化与产业资源碎片化的问题所困扰。从产品定义、芯片选型,到软硬件研发和测试,物联网技术的碎片化以及产业资源的碎片化,始终对团队的产品开发交付质量和效率形成制约。为了减少因物联网碎片化而带来的重复开发工作,我们着手对物联网开发中高频应用的技术知识进行沉淀管理,并基于 Bloom OS 搭建了不同平台的 RTOS 应用生态。后来我们发现,很多物联网产品开发团队都面临着相似的困扰,于是,我们决定向全体物联网行业开发者开放奇迹物联内部沉淀的应用技术知识库 Wiki,期望能为更多物联网产品开发者减轻一些重复造轮子的负担。

Cellular IoT Wiki沉淀的技术内容方向如下:

wKgaombqoM2AYL2RAAQrZ8e-uz8392.jpg

奇迹物联的业务服务范围:基于自研的NB-IoT、Cat1、Cat4等物联网模组,为客户物联网ODM/OEM解决方案服务。我们的研发技术中心在石家庄,PCBA生产基地分布在深圳、石家庄、北京三个工厂,满足不同区域&不同量产规模&不同产品开发阶段的生产制造任务。跟传统PCBA工厂最大的区别是我们只服务物联网行业客户。

连接我们,和10000+物联网开发者一起 降低技术和成本门槛

让蜂窝物联网应用更简单~~

哈哈你终于滑到最重要的模块了,

千万不!要!划!走!忍住冲动!~

欢迎加入飞书“开源技术交流群”,随时找到我们哦~

点击链接如何加入奇迹物联技术话题群(https://rckrv97mzx.feishu.cn/docx/Xskpd1cFQo7hu9x5EuicbsjTnTf)可以获取加入技术话题群攻略

Hey 物联网从业者,

你是否有了解过奇迹物联的官方公众号“eSIM物联工场”呢?

这里是奇迹物联的物联网应用技术开源wiki主阵地,欢迎关注公众号,不迷路~

及时获得最新物联网应用技术沉淀发布

注:本文部分内容来源于网络,如有侵权,请及时联系我们。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 物联网
    +关注

    关注

    2900

    文章

    44052

    浏览量

    370096
  • MODBUS
    +关注

    关注

    28

    文章

    1757

    浏览量

    76756
  • 通讯协议
    +关注

    关注

    10

    文章

    265

    浏览量

    20307
收藏 人收藏

    评论

    相关推荐

    esp32 idf支持modbus ascii协议的主机模式吗?

    esp32 idf 支持 modbus ascii协议的主机模式吗?
    发表于 06-25 06:25

    无线ModBus实训套件应用方案

    元器件、PCB电路板根据实验指导书一步步地完成ModBus主机ModBus从机两个电子设备的软硬件综合设计,从而实现对无线通信、ModBu协议以及物
    发表于 06-24 14:15

    【WRTnode2R申请】联网主机

    申请理由:原有方案使用stm32以及工控机,对wifi的原生支持不太好,因为手机等联网比较麻烦,毕竟农业联网不具备特别好的实施环境所以我准备换掉方案项目描述:准备实现新版本的农业
    发表于 09-10 11:27

    联网嵌入式系统

    到物理对象实现物理对象的智能化。 基础上的嵌入式应用系统,嵌入到物理对象,给物理对象完整的联界面。与物理参数相联的是前向通道的传感器
    发表于 11-27 16:09

    【Tisan联网试用体验】modbus通信实验(1)

    modbus_master_init()函数。3.modbus master功能实现:在object目录下增加modbus.c和modbus
    发表于 12-06 11:54

    联网卡适合哪些行业使用?哪些行业需要联网卡?

    。在整个智能安防系统联网卡能够将安防系统的设备进行连接,并且及时准确的传输信息,能够帮助
    发表于 02-12 10:50

    【NUCLEO-L552ZE-Q开发板试用连载】基于联网操作的恒温恒湿控制系统

    modbus,设备往往需要多路串口实现modbus,可自由配置主机从机。3、移植文件系统,用于存储设备数据,导出数据分析图表。4、连接wif
    发表于 03-11 15:32

    MiCO联网操作系统

    发展,逐步形成了自有的生态系统联网改变了人物交互的方式,也改变了一些相关的商业模式,我们可以从中想到或做点什么呢?MiCO
    发表于 08-20 06:06

    求一种基于阿里云实现联网多种传感器上云解决方案

    基于阿里云实现联网多种传感器上云解决方案-锅炉房蒸汽系统(整体概述)方案一项目实施优势缺点方案二项目实施优势缺点方案三项目实施优势缺点方案一以传感器类型为单位创建物模型,网关选择支持
    发表于 12-17 07:01

    modbus联网协议具体实现

    的master,余下的节点作为slave,然后采用问-答的交互逻辑,就可以很好的实现预期目标。在选主节点的时候,通常会选计算性能最强的一个节点。在RS-485的具体实现上,工业上常用的问答式协议是modbus
    发表于 01-19 07:07

    联网的演变,联网的过去、现在和未来

    使用。由于Modbus是总线协议,支持多个从站,可以很方便搭建物联网系统。只要兼容标准Modbus,就可以让数字传感器和控制器直接联网,通过
    发表于 06-11 06:30

    如何快速实现Modbus RTU和Modbus TCP协议转换?

    Modbus RTU转Modbus TCP,实现不同协议设备通讯呢?01通博联工业智能网关协议转换功能,快速实现
    发表于 08-18 18:36

    基于RT-Thread系统的通用联网系统平台设计方案

    扩展,而且成本价格相对合理。人机设备主要指的是手机和平板电脑一类终端设备,它们通过运行专用的APP或者B/S模式的形态存在,负责与后台云服务器进行通讯,从而与联网设备进行交互。这部分不属于本次作品的范畴
    发表于 08-29 15:42

    什么是Modbus工业联网网关

    网关设备,还支持各类产家的私有协议转换,可以把分散的串行设备、主机等通过网络简易、方便的集中管理,用户可轻松实现工业联网网关Modbus
    发表于 12-05 09:05 2979次阅读

    Modbus联网网关是什么

    Modbus联网网关是一种专门用于将基于Modbus协议的设备连接到联网(IoT)的设备或软
    的头像 发表于 08-10 13:49 373次阅读
    <b class='flag-5'>Modbus</b><b class='flag-5'>物</b><b class='flag-5'>联网</b>网关是什么