b_mod_protocol
此模块提供通用协议格式,测试软件(https://gitee.com/notrynohigh/BabyOS_Protocol/tree/master):
/**
| | | | | | |
| :--- | ------------------ | ------------------- | ----- | -------- | ----- |
| Head | Device ID | Len(cmd+param) | Cmd | Param | Check |
| 0xFE | sizeof(bProtoID_t) | sizeof(bProtoLen_t) | 1Byte | 0~nBytes | 1Byte |
*/
设备ID的长度以及len字段的长度可以在b_config文件进行配置。
设备ID:发送数据时,该字段是目标设备的ID , 如果设备ID为0xFFFFFFFF表示广播。
接收数据时,判断ID字段与自身的ID是否匹配。或者ID是否为0xFFFFFFFF。
数据结构
#if PROTO_FID_SIZE == 1
typedef uint8_t bProtoID_t;
#define INVALID_ID 0XFF
#elif PROTO_FID_SIZE == 2
typedef uint16_t bProtoID_t;
#define INVALID_ID 0XFFFF
#else
typedef uint32_t bProtoID_t;
#define INVALID_ID 0XFFFFFFFF
#endif
#if PROTO_FLEN_SIZE == 1
typedef uint8_t bProtoLen_t;
#else
typedef uint16_t bProtoLen_t;
#endif
#pragma pack(1)
typedef struct
{
uint8_t head;
bProtoID_t device_id;
bProtoLen_t len;
uint8_t cmd;
} bProtocolHead_t;
#pragma pack()
//分发函数,当接收的数据按照协议解析成功,则调用分发函数
typedef int (*pdispatch)(uint8_t cmd, uint8_t *param, bProtoLen_t param_len);
#define PROTOCOL_HEAD 0xFE
接口介绍
//初始化,指定设备自身的ID和分发函数
int bProtocolInit(bProtoID_t id, pdispatch f);
//修改设备ID
int bProtocolSetID(bProtoID_t id);
//将接收到的数据喂给模块进行解析
int bProtocolParse(uint8_t *pbuf, bProtoLen_t len);
//将数据根据协议打包。打包完成的数据放在pbuf,同时返回数据长度
int bProtocolPack(uint8_t cmd, uint8_t *param, bProtoLen_t param_size, uint8_t *pbuf);
使用例子
//协议分发函数 cmd:指令 param:参数 param_len:参数长度
int ProtocolDispatch(uint8_t cmd, uint8_t *param, bProtoLen_t param_len)
{
b_log("cmd:%d param_len: %d\r\n", cmd, param_len);
// 添加指令对应的执行代码
return 0;
}
//接收空闲
int ProtocolRecCallback(uint8_t *pbuf, uint16_t len)
{
//接收完一段数据后,将数据给模块进行解析
bProtocolParse(pbuf, len);
return 0;
}
bUTIL_UART_INSTANCE(protocol, 128, 100, ProtocolRecCallback);
int main()
{
...
bInit();
bProtocolInit(0x520, ProtocolDispatch);
...
}