0%

串口通信时自定义协议的数据包设计与解析方法3

前言:

前面写了串口通信时自定义协议的数据包设计与解析方法的笔记,笔记介绍三种方式,都在一个文件操作,觉得拆分为多文件为好,于是有了这篇文章。

代码目录结构如下图示:

注意:

文件名词之间下划线不能正常显示,很奇怪!

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里调试方便。