# DataCodec_c **Repository Path**: aikoder/data-codec_c ## Basic Information - **Project Name**: DataCodec_c - **Description**: 这是C通用版本 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-25 - **Last Updated**: 2024-08-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Data Codec Library ## 简介 Data Codec Library 是一个用于嵌入式设备的数据编码和解码库。该库提供了数据包的编码和解码功能,并且具有良好的性能和资源利用率,适用于资源有限的嵌入式系统。 ## 功能 - 数据包的编码和解码 - 校验和计算和校验 - 可配置的日志功能 - 版本管理 ## 版本 当前版本:`1.0.0` ## 文件结构 ``` data_codec/ ├── include/ │ └── data_codec.h ├── src/ │ ├── data_codec.c │ └── test_codec.c ├── CMakeLists.txt └── README.md ``` ## 编译和运行 ### 使用 CMake 编译库和测试用例 1. 确保安装了 CMake 和 GCC 编译器。 2. 进入项目目录。 3. 创建一个构建目录并进入: ```sh mkdir build cd build ``` 4. 运行 CMake 配置项目: ```sh cmake .. ``` 5. 编译项目: ```sh cmake --build . ``` ### 运行测试用例 编译完成后,运行生成的测试用例可执行文件: ```sh ./test_codec ``` 你将看到类似以下的输出,表示库的版本和测试用例的结果: ``` Data Codec Version: 1.0.0 Starting tests... Starting normal packet test... Decoded packet: header=55aa, len=26, seq=123, cmd=456, data_len=10, data=... Normal packet test completed. Starting sticky packet test... Sticky packet test completed. Starting fragmented packet test... Fragmented packet test completed. Starting error packet test... Failed to decode packet, as expected Error packet test completed. All tests completed. ``` ## 接口文档 ### 数据包结构体 `pkt_t` ```c typedef struct { uint16_t header; // 数据包同步码,固定值0x55AA uint16_t len; // 数据包总长度 uint16_t crc; // 校验和(累加计算,排除crc字段) uint16_t seq; // 序列号 uint16_t cmd; // 命令 uint16_t data_len; // 数据长度 uint8_t data[]; // 可变长度数据 } pkt_t; ``` ### 编码器结构体 `data_codec_t` ```c typedef struct { void (*encode)(const pkt_t *packet, const uint8_t *data, uint8_t *buffer, size_t *len); int (*decode)(const uint8_t *stream, size_t stream_len, pkt_t *packet); void (*set_log_level)(log_level_t level); } data_codec_t; ``` ### 初始化函数 ```c void data_codec_init(data_codec_t *codec, log_level_t log_level, log_fn_t log_fn); ``` ### 获取版本号 ```c const char* data_codec_get_version(void); ``` ### 日志函数指针类型 `log_fn_t` ```c typedef void (*log_fn_t)(log_level_t level, const char *format, va_list args); ``` ## 示例代码 ### 初始化编码器 ```c data_codec_t codec; data_codec_init(&codec, LOG_INFO, my_log_function); ``` ### 编码数据包 ```c uint8_t buffer[MAX_PACKET_SIZE]; size_t len; uint8_t data[10] = { ... }; generate_packet(123, 456, data, sizeof(data), buffer, &len); ``` ### 解码数据包 ```c pkt_t decoded_pkt; int result = codec.decode(buffer, len, &decoded_pkt); if (result == 0) { // 成功解码 } ``` ## 测试用例 测试用例位于 `src/test_codec.c` 文件中。包括以下测试场景: - 正常数据包测试 - 粘包测试 - 分包测试 - 错误数据包测试 ## 注意 * 1.在Zephyr中运行时,注意堆栈大小,不然会报错 ``` [00:00:01.262,512] os: ***** USAGE FAULT ***** [00:00:01.262,512] os: Illegal load of EXC_RETURN into PC [00:00:01.262,542] os: r0/a1: 0x001655aa r1/a2: 0x0297077c r2/a3: 0x000a0023 [00:00:01.262,542] os: r3/a4: 0xebe4c2ae r12/ip: 0xe1a2011b r14/lr: 0x55aa5a69 [00:00:01.262,573] os: xpsr: 0x003e0200 [00:00:01.262,573] os: Faulting instruction address (r15/pc): 0x06e80016 [00:00:01.262,603] os: >>> ZEPHYR FATAL ERROR 34: Unknown error on CPU 0 [00:00:01.262,634] os: Current thread: 0x20000618 (unknown) [00:00:01.491,394] os: Halting system ``` 可在`prj.conf`中配置: ``` CONFIG_HEAP_MEM_POOL_SIZE=16384 CONFIG_MAIN_STACK_SIZE=4096 ``` ## 许可证 该项目使用 MIT 许可证。