# uart_obj_fw 轻量级串口框架 **Repository Path**: water_source/lightweight-serial-framework ## Basic Information - **Project Name**: uart_obj_fw 轻量级串口框架 - **Description**: 轻量级跨平台串口通信框架,专为资源受限的嵌入式设备设计。单个对象RAM占用最小68字节左右(不算缓冲区),ROM占用1-2k字节左右,功能支持裁剪,资源占用小并不代表低性能,该库参考了freeRTOS的队列实现,进行简化处理,保留最核心的功能,对于数据的FIFO操作,分析了拷贝原数据的劣势,采用了类似拷贝指针的方式,减少内存占用,提高效率。同时代码风格较好,有配套注释以及作者开发过程中的思考。 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2025-06-07 - **Last Updated**: 2025-06-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # uart_obj_fw 轻量级串口框架 #### 介绍 轻量级跨平台串口通信框架,专为资源受限的嵌入式设备设计。单个对象RAM占用最小68字节左右(不算缓冲区),ROM占用1-2k字节左右,功能支持裁剪,资源占用小并不代表低性能,该库参考了freeRTOS的队列实现,进行简化处理,保留最核心的功能,对于数据的FIFO操作,分析了拷贝原数据的劣势,采用了类似拷贝指针的方式,减少内存占用,提高效率。同时代码风格较好,有配套注释以及作者开发过程中的思考。 #### demo demo使用CW32F030C8 ARM Cortex-M0+ 内核单片机,该例程充分发挥了单片机的性能,提供了单字节中断和DMA的框架例程,用户可参考此例程来快速开始。 #### 缓冲区FIFO策略 - 完全型缓冲区策略:无论数据量大小,收到一包数据都固定消耗一个缓冲区,该方式内存利用率低,但管理起来简单,代码量少。 - 紧凑型FIFO策略:根据数据量大小,消耗的缓冲区大小为动态,该方式内存利用率高,但管理起来麻烦,需要更多代码。 - tips:目前的FIFO策略为完全型缓冲区策略,后期看情况更新紧凑型策略 #### 特色 - 面向对象思想,高内聚低耦合 - 资源占用极低,效率高,ROM占用1-2k字节 - 数据溢出保护,自动切换或锁定缓冲区 - 支持串口单字节中断,适配没有dma的单片机 - 支持串口DMA或DMA+IDLE中断 - 支持轻量级printf,使用第三方xprintf库节省内存 - 支持变量转字符串库,省去printf,进一步减小内存 - 日志输出功能,在初始化时为用户提示错误信息以及初始化详情 - 线程安全设计,用户根据所使用的RTOS实现lock和unlock后,使用外设是非常安全的 - 无malloc函数,零动态内存申请 - 兼容C89版本编译器 #### 配置项 | 配置项 | 作用 | |-------------------------------|-----------------------------------| | USE_ONE_BYTE_IT_MODE | 串口单字节中断模式 1-启用,0-不启用 | | USE_DMA_MODE | 串口DMA模式 1-启用,0-不启用 | | USE_DMA_NOT_HAVE_RX_IDLE_MODE | 不支持DMA空闲中断模式 1-启用,0-不启用 | | USE_DMA_RX_CNT_MODE | DMA接收计数器模式选择 | | USE_UART_TX_BIN_DATA | 串口发送二进制数据接口 1-启用,0-不启用 | | USE_UART_TX_STR_DATA | 串口发送字符串数据接口 1-启用,0-不启用 | | USE_UART_PRINTF | 串口格式化输出接口 1-启用,0-不启用 | | UART_PRINTF_BUFFER_SIZE | 串口printf缓存区大小 | | USE_UART_PRINTF_BUF_STATIC | 串口printf静态缓存区 1-使用,0-不使用 | | USE_INFO_LOG | 启用日志打印 1-启用,0-不启用 | | USE_CHECK_INPUT_HANDLE_PARA | 检查输入参数合法性 1-启用,0-不启用 | | USE_STD_LIB | 使用标准库printf 1-启用,0-不启用 | | USE_STRING_EX_LIB | 使用字符串扩展库 1-启用,0-不启用 | #### 仓库架构 | 文件 | 功能 | |-------|------| | demo | 示例工程 | | lib | 库文件 | | other | 其他文件 | #### 库文件说明 | 文件 | 功能 | |-----------|------------------| | uart_obj | 串口收发框架核心文件 | | xprintf | 第三方轻量级printf库 | | string_ex | 自定义扩展字符串库| #### 多缓冲区的意义 在生产消费模型中,如果生产的数据能在下一次生产之前及时消费,则并不需要多缓冲区,否则需要,因为不加多缓冲区会发生数据覆盖或者数据丢失的情况。多缓冲区的意义在于,短时间内生产速度大于消费速度,对这种情况进行数据缓存,如果一直是生产速度大于消费速度,缓冲区再大也会被填满,该问题不是缓冲区的问题了,是性能跟不上,考虑降低生产速度,优化代码或者更换高性能芯片。多缓冲区结合DMA是最优的,在解析期间,DMA可以继续接收数据,两者并行。因此FIFO深度为2为最低标准,设置为1将没有缓存和并行的效果,实际设置多少根据项目需求选择。 #### 移植教程 todo #### 问题反馈 后期用户量多了考虑创办QQ群,目前问题和建议提issue #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)