## b_util_uart ### 数据结构 ```C //串口接收空闲的回调 typedef int (*pbUartIdleCallback_t)(uint8_t *pbuf, uint16_t len, void *arg); typedef struct UtilUart { uint8_t *pbuf; uint16_t buf_size; volatile uint16_t index; uint32_t idle_thd_ms; pbUartIdleCallback_t callback; void *cb_arg; uint32_t l_tick; uint32_t l_index; struct UtilUart *next; struct UtilUart *prev; } bUitlUart_t; typedef bUitlUart_t bUitlUartInstance_t; //用于创建串口接收实例 #define bUTIL_UART_INSTANCE(name, buf_len, idle_ms, cb, arg) \ static uint8_t Buf##name[buf_len]; \ bUitlUartInstance_t name = { \ .pbuf = Buf##name, \ .buf_size = buf_len, \ .idle_thd_ms = idle_ms, \ .callback = cb, \ .cb_arg = arg, \ .index = 0, \ .l_tick = 0, \ .l_index = 0, \ .prev = NULL, \ .next = NULL, \ } ``` ### 接口介绍 ```C // 初始化用户定义的bUitlUartInstance_t(没有使用bUTIL_UART_INSTANCE去定义实例的情况) void bUtilUartInitStruct(bUitlUartInstance_t *pinstance, uint8_t *pbuf, uint16_t size, uint32_t idle_ms, pbUartIdleCallback_t cb, void *arg); // 将串口号绑定到已有实例,绑定后可以用 bUtilUartRxHandler2和bUtilUartReceivedSize2 void bUtilUartBind(uint8_t uart_no, bUitlUartInstance_t *pinstance); // bUtilUartRxHandler 和 bUtilUartRxHandler2 效果是一样 // 但是,只有通过bUtilUartBind绑定串口号,才能调用bUtilUartRxHandler2 void bUtilUartRxHandler(bUitlUartInstance_t *pinstance, uint8_t dat); void bUtilUartRxHandler2(uint8_t uart_no, uint8_t dat); // 获取当前BUF中已经收到的数据长度 uint16_t bUtilUartReceivedSize(bUitlUartInstance_t *pinstance); uint16_t bUtilUartReceivedSize2(uint8_t uart_no); ```