串口通过UART接口通过USB与上位机通信,配置成中断接收和中断发送模式,并创建了串口接收环形队列和串口发送环形队列,中断接收的数据存放在串口接收环形队列里,串口需要发送的数据放到串口发送环形队列里。
为什么要使用环形队列呢,它有什么优点?
环形队列是在实际编程极为有用的数据结构,它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单。能很快知道队列是否满为空。能以很快速度的来存取数据。
1.缓冲:使用队列可以缓冲数据,提升收发数据的性能。
2.高效:相比直线队列,空间利用率高。
2.多任务:配合中断,串口和主循环可以在互不干扰的情况下独立工作。
读取串口数据流程:
串口有数据时,触发中断,读取串口缓冲区到读循环队列rx_buffer,主循环中解析和执行rx_buffer中的指令;
写入串口数据流程:
把指令执行的结果消息放入写循环队列tx_buffer,串口写缓冲区为空时触发中断,从写循环队列读取数据到串口写缓冲区。
具体实现:
与串口收发相关的源代码有以下文件:
serial.c:低阶串口通信封装。
report.c:通知状态映射和消息组装
print.c:不同数据结构的格式化
protocol.c:主循环,消费读缓冲区的数据
我们重点分析serial.c,在该文件中定义了串口的初始化,重置,读取,写入和计数等功能,并设置了串口收发中断处理。