尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

用c语言编写一个串口接收字符串子函数,当接收到回车换行符后,设置接收标志为TRU

用c语言编写一个串口接收字符串子函数,当接收到回车换行符后,设置接收标志为TRU #include stdio.h #include stdbool.h #include string.h #define RX_BUFFER_SIZE 256 /* 接收标志 */ volatile bool g_rxComplete false; // TRUE 表示一帧接收完成 volatile bool g_rxOverflow false; // 缓冲区溢出标志 /* 接收缓冲区 */ static char s_rxBuf[RX_BUFFER_SIZE]; static unsigned int s_rxIndex 0; /** * brief 串口接收字符串子函数在串口中断或轮询中被调用 * param data 本次从串口读到的字节 * note 接收到 \n换行符通常由回车换行 \r\n 触发后 * 认为一帧结束置位接收完成标志并在末尾补 \0 */ void Uart_RxStringHandler(char data) { /* 如果上一帧还没被处理可选择丢弃或继续覆盖这里选择丢弃新数据 */ if (g_rxComplete) { return; } /* 判断是否收到换行符一般回车换行是 \r\n以 \n 作为结束判断 */ if (data \n) { s_rxBuf[s_rxIndex] \0; // 字符串结束符 g_rxComplete true; // 置位接收完成标志 return; } /* 忽略回车符 \r可选视具体协议而定 */ if (data \r) { return; } /* 存入缓冲区防止溢出 */ if (s_rxIndex (RX_BUFFER_SIZE - 1)) { s_rxBuf[s_rxIndex] data; } else { g_rxOverflow true; // 溢出处理 s_rxIndex 0; // 复位索引丢弃本帧 } } /** * brief 获取接收到的字符串处理完后需调用 Uart_RxReset 复位 * return 指向接收缓冲区的指针 */ char *Uart_GetRxString(void) { return s_rxBuf; } /** * brief 复位接收状态准备接收下一帧 */ void Uart_RxReset(void) { s_rxIndex 0; g_rxComplete false; g_rxOverflow false; memset(s_rxBuf, 0, sizeof(s_rxBuf)); } /* ---------------- 使用示例 ---------------- */ int main(void) { /* 模拟串口依次收到的数据Hello\r\n */ const char *test Hello\r\n; const char *p test; while (*p) { Uart_RxStringHandler(*p); /* 每来一个字节检查一次标志 */ if (g_rxComplete) { printf(收到一帧: %s\n, Uart_GetRxString()); Uart_RxReset(); // 处理完后复位准备下一帧 } } return 0; }关键设计说明
返回列表