如何操作?
我先把一个数据做成流 打印出来--然后通过串口把这个流发送给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