# DataCodec **Repository Path**: aikoder/data-codec ## Basic Information - **Project Name**: DataCodec - **Description**: DataCodec 是一个用于嵌入式 Linux、Windows 和 macOS 环境的高效数据编解码类,支持对流数据进行编码和解码,并处理粘包和超时问题。新增日志级别设置功能,方便调试。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-05-25 - **Last Updated**: 2024-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DataCodec ## 介绍 DataCodec 是一个用于嵌入式 Linux、Windows 和 macOS 环境的高效数据编解码类,支持对流数据进行编码和解码,并处理粘包和超时问题。新增日志级别设置功能,方便调试。 ## 功能 - 编码数据包 - 解码流数据 - 处理粘包问题 - 超时机制自动重置状态机 - 日志级别设置(NONE、ERROR、INFO、DEBUG) ## 文件列表 - `data_codec.h`:编解码类的头文件 - `data_codec.cpp`:编解码类的实现文件 - `test_codec.cpp`:测试用例文件 - `serial_test.cpp`:串口数据接收测试用例 - `CMakeLists.txt`:CMake 构建文件 ## 编码和编译 ### 编码说明 所有源文件均使用 UTF-8 编码,以防止中文注释出现乱码。 ### 编译说明 确保已安装 CMake 和 g++/clang++ 编译器。使用以下命令编译程序: ```bash mkdir build cd build cmake .. make ``` #### 在 Windows 上编译 确保已安装 CMake 和 Visual Studio。使用以下命令编译程序: ```bash mkdir build cd build cmake .. -G "Visual Studio 15 2017 Win64" cmake --build . ``` ## 使用说明 ### 编解码类 ```bash #include "data_codec.h" DataCodec codec; // 编码示例 std::vector data_buffer = ...; pkt_t packet = ...; std::vector encoded_data = codec.encode(packet, data_buffer.data()); // 解码示例 std::vector data_stream = ...; std::vector> decoded_packets = codec.decode(data_stream); ``` ### 串口数据接收测试用例 ```bash #include "serial_test.cpp" int main(int argc, char* argv[]) { if (argc < 2) { std::cerr << "Usage: " << argv[0] << " [baud_rate] [ctsrts] [log_file]" << std::endl; return 1; } std::string port_name = argv[1]; int baud_rate = 115200; bool ctsrts = false; std::string log_filename = "serial_test.log"; if (argc >= 3) { int baud = std::stoi(argv[2]); #ifdef _WIN32 baud_rate = baud; // Windows下直接使用baud_rate #else switch (baud) { case 9600: baud_rate = B9600; break; case 19200: baud_rate = B19200; break; case 38400: baud_rate = B38400; break; case 57600: baud_rate = B57600; break; case 115200: baud_rate = B115200; break; case 1000000: baud_rate = 1000000; break; default: std::cerr << "Unsupported baud rate. Using default 115200." << std::endl; break; } #endif } if (argc >= 4) { ctsrts = std::stoi(argv[3]) != 0; } if (argc >= 5) { log_filename = argv[4]; } try { SerialReceiver receiver(port_name, baud_rate, ctsrts, log_filename); std::this_thread::sleep_for(std::chrono::seconds(30)); // 模拟接收数据 30 秒 } catch (const std::exception& e) { std::cerr << "异常: " << e.what() << std::endl; } return 0; } ``` 在`serial_test`测试用例中,程序将接收串口数据并进行解码,同时检查解码数据的序列号连续性。如果发现序列号不连续,会记录日志到指定的日志文件,并在终端输出错误信息。 ## 测试用例 ### 测试 1: 模拟粘包数据流`[AA55AA55]` ```bash std::vector data_stream = {0xAA, 0x55, 0xAA, 0x55}; std::vector> decoded_packets = codec.decode(data_stream); ``` ### 测试 2: 正常多组数据流的测试 ```bash for (int i = 0; i < 5; ++i) { std::vector data_buffer; pkt_t packet = generateRandomPacket(data_buffer); std::vector encoded_data = codec.encode(packet, data_buffer.data()); std::vector normal_data_stream; normal_data_stream.insert(normal_data_stream.end(), encoded_data.begin(), encoded_data.end()); decoded_packets = codec.decode(normal_data_stream); } ``` ### 测试 3: 超时测试 ```bash std::vector incomplete_data_stream = {0xAA, 0x55}; codec.decode(incomplete_data_stream); std::this_thread::sleep_for(std::chrono::milliseconds(1500)); std::vector data_stream_after_timeout = {0xAA, 0x55, 0xAA, 0x55}; decoded_packets = codec.decode(data_stream_after_timeout); ``` ## 许可证 该项目使用 MIT 许可证,详情请参见 LICENSE 文件。