前言:
前面写了串口通信时自定义协议的数据包设计与解析方法的笔记,笔记介绍三种方式,都在一个文件操作,觉得拆分为多文件为好,于是有了这篇文章。
代码目录结构如下图示:
注意:
文件名词之间下划线不能正常显示,很奇怪!
stm32_main.c代码如下:
#include<stdio.h>
#include"stm32_protocol_parser.h"
//packet格式={boot len cmd data[] check}
void main(void)
{
int txbuff[5] = { 0x40,0x03,0x02,0xBC,0xBD };
int rxbuff[64];
int len = 0;
packet_cmds_parse(txbuff, 5, rxbuff, &len);
printf("main\n");
}
stm32_protocol_parser.c代码如下:
#include"stm32_protocol_parser.h"
#include"stm32_protocol_cmds.h"
void app_get_version(int* idata, int ilen, int* odata, int* olen)
{
printf("app_get_version\n");
}
void app_start_read(int* idata, int ilen, int* odata, int* olen)
{
printf("app_start_read\n");
}
void app_handle_err(int* idata, int ilen, int* odata, int* olen)
{
printf("app_handle_err\n");
}
void packet_cmds_parse(int* idata, int ilen, int* odata, int* olen)
{
packet_cmd_list_t* pcmd_list = app_cmds_list;
packet_t* pcmd = (packet_t*)idata;
while ((pcmd_list->cmd != pcmd->cmd) && (pcmd_list->cmd != 0))
{
pcmd_list++;
}
// 查表结束,执行表中对应回调函数
pcmd_list->pcallback(idata, ilen, odata, olen);
}
stm32_protocol_cmds.h代码如下:
#pragma once
#include <string.h>
#include <stdio.h>
#include<stdint.h>
#pragma pack(1)
typedef enum {
BOOT_CODE_OK = 0x40,
BOOT_CODE_RETURN = 0xF0,
BOOT_CODE_ERROR = 0xF4
}packet_boot_code_e;
typedef enum {
NONE = 0x00,
CMD_GET_VER = 0x02,
CMD_START_READ = 0x06
}packte_cmd_e;
typedef struct {
packet_boot_code_e boot_code;
int len;
packte_cmd_e cmd;
int data[64];
int check;
}packet_t;
typedef struct {
packte_cmd_e cmd;
void(*pcallback)(int* idata, int ilen, int* odata, int* olen);
}packet_cmd_list_t;
packet_cmd_list_t app_cmds_list[] =
{
{CMD_GET_VER, app_get_version },
{CMD_START_READ, app_start_read },
{NONE, app_handle_err }
};
#pragma pack()
stm32_protocol_parser.h代码如下:
#pragma once
void packet_cmds_parse(int* idata, int ilen, int* odata, int* olen);
void app_get_version(int* idata, int ilen, int* odata, int* olen);
void app_start_read(int* idata, int ilen, int* odata, int* olen);
void app_handle_err(int* idata, int ilen, int* odata, int* olen);
运行结果如下:
结束语
这几篇和数据包解析的笔记都是在VS2019里调试,总是觉得MDK里没有VS里调试方便。