如何修改程序以使用Interrupt I/O而非polling读取可变长度字符串
中断I/O替代轮询读取可变长度字符串修改步骤
以下默认基于UART串口读取可变长字符串的常见场景,字符串以\n/\r或自定义字符作为终止标志,具体修改步骤如下:
- 移除原有轮询逻辑:删除代码中反复读取外设状态寄存器判断可读位的循环等待代码,这类代码通常格式为
while (!(UART_STATUS_REG & RX_READY_FLAG)) {},不需要再通过死循环等待数据就绪。 - 配置接收中断使能:修改外设控制寄存器的中断掩码位,开启接收缓冲非空中断,部分封装好的库可以直接调用对应接口,比如STM32 HAL库下的配置代码为
HAL_UART_Receive_IT(&huart1, &single_byte_buf, 1),配置为每接收到1字节就触发一次中断。 - 实现中断服务函数(ISR)逻辑:
- 每次触发中断后,先读取接收寄存器内的1字节数据,写入预先开辟的全局/静态接收缓冲区
- 校验当前读取的字节是否为预设的字符串终止符,若不是则更新缓冲区指针,重新配置下一次单字节接收中断
- 若读到终止符,直接在缓冲区末尾补
\0作为C语言字符串结束标记,同时置位全局的字符串接收完成标志位
- 调整主程序逻辑:主程序不需要主动读取外设,仅需在合适的位置判断
字符串接收完成标志位是否被置位,置位后直接读取缓冲区的完整字符串做后续处理,处理完成后重置标志位和缓冲区指针即可。
注意:中断服务函数内仅做字节读取、缓冲存储和标志位操作,不要执行字符串解析、打印等耗时逻辑,避免影响其他中断的响应优先级。
相关参考代码及问题图示:
内容的提问来源于stack exchange,提问作者Coder21
相关产品推荐
相关产品推荐

