编写串口接收函数时
当通信速率很高,且单片机速度较慢时
如果接收函数写的不仔细就会发生数据没接收到的情况
下面的代码考虑到了每次对接收缓冲区的操作 每次进中断就读取缓冲区所有的数据 值得借鉴
// UART2中断服务函数
void UART2_ISR(void)
{
char c;
unsigned long ulStatus;
ulStatus = UARTIntStatus(UART2_BASE, true); // 读取当前中断状态
UARTIntClear(UART2_BASE, ulStatus); // 清除中断状态
if ((ulStatus & UART_INT_RX) || (ulStatus & UART_INT_RT)) // 若是接收中断或者
{ // 接收超时中断
for (;;)
{
if (!UARTCharsAvail(UART2_BASE)) break; // 若接收FIFO里无字符则跳出
c = UARTCharGetNB(UART2_BASE); // 从接收FIFO里读取字符
if (c == '\r')
{
UARTCharPut(UART2_BASE, '\r'); // 回显回车换行
UARTCharPut(UART2_BASE, '\n');
RxEndFlag = true; // 接收结束标志置位
break;
}
if (isprint(c)) // 若是可打印字符
{
if (BufP MAX_SIZE)
{
UARTCharPut(UART2_BASE, c); // 回显
RxBuf[BufP++] = c;
RxBuf[BufP] = '\0';
}
}
}
}
}
文章评论(0条评论)
登录后参与讨论