当前位置: 首页 > 工具软件 > nanopb > 使用案例 >

基于RT1052 Aworks nanopb string 类型固定长度使用方式(二十七)

乔宏峻
2023-12-01

本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行开发

本文在Aworks上使用nanopb库对string类型使用限制最大长度

1. 定义string消息协议

// A very simple protocol definition, consisting of only
// one message.

syntax = "proto2";
package com.bst.modules.iot.proto;
import "nanopb.proto";

message LaneStatus {
    bool showLane = 1; //true:显示/ false:隐藏
    string laneBackInfo = 2 [(nanopb).max_size = 128]; //车道背景信息
    string laneSelectInfo = 3 [(nanopb).max_size = 128]; //车道前景信息
}

使用如下命令进行编译

..\..\generator-bin\protoc --nanopb_out=. simple.proto

最终生成的结构体

/* Struct definitions */
typedef struct _com_bst_modules_iot_proto_LaneStatus { 
    bool showLane; /* true:显示/ false:隐藏 */
    char laneBackInfo[128]; /* 车道背景信息 */
    char laneSelectInfo[128]; /* 车道前景信息 */
} com_bst_modules_iot_proto_LaneStatus;

2.测试代码

int lane_status_test_main()
{
    /* This is the buffer where we will store our message. */

     uint8_t buffer[128] = {0};
    size_t message_length = 0;
 
 
    bool status;
    
    /* Encode our message */
    {
        /* Allocate space on the stack to store the message data.
         *
         * Nanopb generates simple struct definitions for all the messages.
         * - check out the contents of simple.pb.h!
         * It is a good idea to always initialize your structures
         * so that you do not have garbage data from RAM in there.
         */
        com_bst_modules_iot_proto_LaneStatus sign = com_bst_modules_iot_proto_LaneStatus_init_zero;
        
        /* Create a stream that will write to our buffer. */
        pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
        
        /* Fill in the lucky number */
        sign.showLane =  true;
			  memcpy(sign.laneBackInfo, "laneBackInfo", strlen("laneBackInfo"));
 			  memcpy(sign.laneSelectInfo, "laneSelectInfo", strlen("laneSelectInfo"));       
        /* Now we are ready to encode the message! */
        status = pb_encode(&stream, com_bst_modules_iot_proto_LaneStatus_fields, &sign);
        message_length = stream.bytes_written;
        aw_kprintf("message_length: %d\n", stream.bytes_written);
        /* Then just check for any errors.. */
        if (!status)
        {
            aw_kprintf("Encoding failed: %s\n", PB_GET_ERROR(&stream));
            return 1;
        }
    }
    
    /* Now we could transmit the message over network, store it in a file or
     * wrap it to a pigeon's leg.
     */

    /* But because we are lazy, we will just decode it immediately. */
    
    {
        /* Allocate space for the decoded message. */
        com_bst_modules_iot_proto_LaneStatus message = com_bst_modules_iot_proto_LaneStatus_init_zero;
        
        /* Create a stream that reads from the buffer. */
        pb_istream_t stream = pb_istream_from_buffer(buffer, message_length);
        
        /* Now we are ready to decode the message. */
        status = pb_decode(&stream, com_bst_modules_iot_proto_LaneStatus_fields, &message);
        
        /* Check for errors... */
        if (!status)
        {
            aw_kprintf("Decoding failed: %s\n", PB_GET_ERROR(&stream));
            return 1;
        }
        
        /* Print the data contained in the message. */
        aw_kprintf("Your showLane was %d!\n", (int)message.showLane);
        aw_kprintf("Your laneBackInfo was %s!\n", (int)message.laneBackInfo);
        aw_kprintf("Your laneSelectInfo was %s!\n", (int)message.laneSelectInfo);				

    }

    return 0;
}

3. 验证

AWorks for i.MX RT1050, build Mar  1 2022

AWorks SDK Version is 2.1.2 <2020-09-30>  
current time: 1970-01-01 01:35:37

Appl|AWorks->>> ication Start. 
message_length: 32
Your showLane was 1!
Your laneBackInfo was laneBackInfo!
Your laneSelectInfo was laneSelectInfo!

4. 总结

固定长度解析比动态长度解析简单多了。

欢迎订阅
嵌入式实操”一个分享开发实践经验的地方。
文章会同时发布到我的 CSDN主页今日头条号 平台上。

 类似资料: