上手PB(5)

如何操作?
我先把一个数据做成流 打印出来--然后通过串口把这个流发送给STM32-然后STM32解析这个流把数据变现出来
这样就完全测试到啦!

如果把数据做成流?

头文件找到结构体
typedef struct _SimpleMessage {
    int32_t lucky_number;
} SimpleMessage;

开始吧
#include "simple.pb.h"
SimpleMessage A;
A.lucky_number=24;
uint8_t streambuf[256];
Protobuf.encode(streambuf,A);
发现问题来了 Protobuf.encode(streambuf,A);这个方法如何实现的?
我还需要一个模块--注意这个是自己写的-余力的那个未解之谜就在于此!
增加一个模块!!
增加进来
开始测试:

main。c

#include "simple.pb.h"
#include "cmd_pb.h"
//包含上面2个即可 一个是自己做的 一个是刚刚增加的它.H包含了base
uint8_t requestBuff[100]={0};//给出内存空间 此后不再使用
pb_ostream_t requestStream = pb_ostream_from_buffer(requestBuff, 100); //requestBuff完成使命 此后是requestStream工作 
SimpleMessage	A = SimpleMessage_init_zero; //结构体直接赋值
A.lucky_number=24;
if(pb_encode_respone(&requestStream ,SimpleMessage_fields ,&A))//结构体 通过模子 转化到流里面 此后流在requestBuff中拿走
G_printHEX(requestBuff,20);//08 18 00 00

上面完成明文--流

继续测试 发给串口 十六进制的08 18就可以解析回来

usart1.c

if(tflg.idle)
{
	if(udata.len==2)
	{
		pb_istream_t requestStream = pb_istream_from_buffer((const uint8_t*)udata.rxBuff, udata.len); //后面的参数是收到的数组 前面放 这里是拿
		SimpleMessage	A = SimpleMessage_init_zero; //拿了以后放在这里
		if(pb_decode(&requestStream, SimpleMessage_fields, &A) == TRUE )
		{
			printf("\r\nA.lucky_number = %d\r\n",A.lucky_number);
		}
	}
}

 

 

 

自己的模块:

#include "cmd_pb.h"

//没有外部使用
bool bytes_encode(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
{
    BytesType *bytes = *arg;
    return pb_encode_tag_for_field(stream, field) &&
           pb_encode_string(stream, bytes->data, bytes->length);
}

//没有外部使用
bool bytes_decode(pb_istream_t *stream, const pb_field_t *field, void **arg)
{

    size_t len = stream->bytes_left;

	return pb_read(stream, *arg, len);

}
/*
增加一个string
GGCommonProto_TSLIOTUpgradeStatus request = GGCommonProto_TSLIOTUpgradeStatus_init_zero;
char *Cdev_id ;
BytesType Bdev_id;
pb_add_bytes(&Bdev_id , (uint8_t *)Cdev_id , strlen(Cdev_id));
pb_encode_bytes(&request.dev_id , &Bdev_id);
*/
bool pb_encode_bytes( pb_callback_t *this , BytesType *bytes)
{

    this->funcs.encode = bytes_encode;
    this->arg = bytes;
    
    return true;
}

//字符串直接回来        pb_decode_bytes(&request.md5 , cfg.bus8001.md5);
bool pb_decode_bytes( pb_callback_t *this , uint8_t *data )
{
    this->funcs.decode = bytes_decode;
    this->arg = data;
    
    return true;
}

void pb_add_bytes(BytesType *Bytes ,uint8_t *data , uint8_t length)
{
    Bytes->data = data;
    Bytes->length = length;
}

//最后的打包发送	if( pb_encode_respone(&requestStream , DeviceProto_GGTSLIOTPassLog_fields , &request) == TRUE)
uint8_t pb_encode_respone(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct)
{
    return pb_encode(stream, fields, src_struct);
}
/*
    BytesType NB;

    pb_add_bytes(&NB,testarry,5);
    pb_encode_bytes(&A.lucky_bytes,&NB);


    if(pb_encode(&requestStream ,ArrayMessage_fields ,&A))


++++++++++++++++++++++++++

ArrayMessage	A = ArrayMessage_init_zero;  
pb_decode_bytes(&A.lucky_bytes, days);
pb_istream_t requestStream = pb_istream_from_buffer((const uint8_t*)udata.rxBuff, udata.len);  
if(pb_decode(&requestStream, ArrayMessage_fields, &A) == TRUE )

*/
#ifndef _CMD_PB_H_
#define _CMD_PB_H_


#include "gunit.h"

#include "pb.h"
#include "pb_decode.h"
#include "pb_encode.h"
#include "pb_common.h"


typedef struct
{
    uint8_t *data;
    uint8_t length;
}BytesType;



uint8_t pb_encode_respone(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct);
void pb_add_bytes(BytesType *Bytes ,uint8_t *data , uint8_t length);
bool pb_decode_bytes( pb_callback_t *this , uint8_t *data );
bool pb_encode_bytes( pb_callback_t *this , BytesType *bytes);
bool bytes_decode(pb_istream_t *stream, const pb_field_t *field, void **arg);
bool bytes_encode(pb_ostream_t *stream, const pb_field_t *field, void * const *arg);
#endif

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值