上篇我们分享了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中获得数据,发送到串口