上篇我们分享了通过串口寄存器实现单片机与电脑的通信,这篇继续通过中断的方式实现,这样能使主循环和串口互不干扰的独立运行。
首先我们开启在UCSR0B中的RXCIE0开关,它的功能是使能串口接收完成中断
UCSR0B |= (1<<RXCIE0);
然后添加串口完成中断的处理函数:
// 串口接收中断处理
ISR(USART_RX_vect) {
data = UDR0; // 从数据寄存器UDR0获取数据
}
然后使能UCSR0B寄存器中的UDRIE0状态位开启中断发送:
UCSR0B |= (1<<UDRIE0);
接着添加数据寄存器UDR0为空的中断:
ISR(USART_UDRE_vect) {
UDR0 = data; // 发送数据到数据寄存器UDR0
data = 0; // 清除缓冲
UCSR0B &= ~(1<<UDRIE0); // 立即关闭数据空中断寄存器
}
串口接收和发送使用data作为buffer,接收的数据放入data,然后把data中的数据发送到串口。完整代码如下:
如果把发送和接收的buffer分开,设计成环形队列,便形成了grbl中的串口通信方式。