在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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主陣地,歡迎關注公眾號,不迷路~

及時獲得最新物聯網應用技術沉淀發布

注:本文部分內容來源于網絡,如有侵權,請及時聯系我們。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 物聯網
    +關注

    關注

    2909

    文章

    44635

    瀏覽量

    373390
  • MODBUS
    +關注

    關注

    28

    文章

    1805

    瀏覽量

    77003
  • 通訊協議
    +關注

    關注

    10

    文章

    274

    瀏覽量

    20354
收藏 人收藏

    評論

    相關推薦

    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 ?3005次閱讀

    Modbus聯網網關是什么

    Modbus聯網網關是一種專門用于將基于Modbus協議的設備連接到聯網(IoT)的設備或軟
    的頭像 發表于 08-10 13:49 ?433次閱讀
    <b class='flag-5'>Modbus</b><b class='flag-5'>物</b><b class='flag-5'>聯網</b>網關是什么
    主站蜘蛛池模板: 欧美69视频在线| 国产成都一二三四区| www.avtt天堂网| 国产呦在线观看视频| 久久久国产在线| 欧美一区二区视频在线观看| 最近最新中文字幕6页| 最新黄色在线| 亚洲欧洲一区| 精品视频网站| 狠狠干狠狠爱| 一级特黄aa毛片免费观看| 久久久免费网站| 免费又黄又爽的禁片视频| 看全色黄大色大片免费| 美女视频黄a全部| 人人爱操| 在线色网站| 国内免费视频成人精品| 国产精品网站在线进入| 伊人成伊人成综合网2222| 国模在线视频一区二区三区| 国产骚b| 性videofree极品另类| 国产精品资源网| 日本xx69| 日韩美女三级| 日本黄页网址| 亚洲最大的黄色网址| www日本黄色| 一本到卡二卡三卡福利| 免费的黄色大片| 国产老头和美女在线观看| 新激情五月| 午夜神马影院| 99热最新网址| 俺去在线| 欧美丝袜一区| 国产精品久久久久久久久福利| 免费啪啪小视频| 欧美久操|