Grbl源码解析与移植-串口环形队列

上篇我们分享了Grbl通过串口中断的方式处理收发数据的例子,并使用一个简单的结构储存数据。这篇我们分享Grbl中一个重要的数据结构:环形队列。通过环形队列做缓冲,协调单片机和串口速度不一致的问题,使得主循环和串口可以互不干扰地协同工作。

总共涉及2个环形队列:接收环形队列serial_rx_buffer和发送环形队列serial_tx_buffer。

#define RX_RING_BUFFER_SIZE 128

#define TX_RING_BUFFER_SIZE 104

uint8_t serial_tx_buffer[TX_RING_BUFFER_SIZE+1];

uint8_t serial_tx_buffer_head = 0;

volatile uint8_t serial_tx_buffer_tail = 0;

uint8_t serial_rx_buffer[RX_RING_BUFFER_SIZE+1];

uint8_t serial_rx_buffer_head = 0;

volatile uint8_t serial_rx_buffer_tail = 0;

通过几个接口把串口封装起来:

void uart_init();

uint8_t uart_read();

void uart_write(uint8_t data);

void printString(const char *s);

实现代码如下:

Grbl串口环形队列实现

在主循环中读取接收环形队列数据和发送数据到发送环形队列:

grbl环形队列使用

具体使用流程如下:

串口接收数据完成,写入到接收环形队列serial_rx_buffer

在主循环中从serial_rx_buffer中读取数据解析之后做下一步处理

发送执行结果到发送环形队列serial_tx_buffer

从serial_tx_buffer中获得数据,发送到串口

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容