串口发送很简单,但是处理不好就会遇到问题,这次我用官方提供的回显的例子进行测试。发现了要注意事项。
void EUSCIA0_IRQHandler(void) { if (EUSCI_A0->IFG & EUSCI_A_IFG_RXIFG) { // Check if the TX buffer is empty first while(!(EUSCI_A0->IFG & EUSCI_A_IFG_TXIFG)); // Echo the received character back EUSCI_A0->TXBUF = EUSCI_A0->RXBUF; } }
这是官方例子中处理回显的,我们可以看到在将本次接收的字符发送回去时候,进行了一个判断,这个判断实际上是判断是不是发送缓冲器里面的内容是不是已经发送完了,再进行
新的发送。如果不加这个会怎么样呢?
我经过测试,添加了若干的发送内容后发现,不加这个,还真不行,会导致接收混乱,你还没有发送出去的数据会被覆盖掉。
// UART interrupt service routine void EUSCIA0_IRQHandler(void) { if (EUSCI_A0->IFG & EUSCI_A_IFG_RXIFG) { // Check if the TX buffer is empty first while(!(EUSCI_A0->IFG & EUSCI_A_IFG_TXIFG)); EUSCI_A0->TXBUF=i+'0'; // while(!(EUSCI_A0->IFG & EUSCI_A_IFG_TXIFG)); EUSCI_A0->TXBUF=':'; // while(!(EUSCI_A0->IFG & EUSCI_A_IFG_TXIFG)); i++; // Echo the received character back EUSCI_A0->TXBUF = EUSCI_A0->RXBUF; // EUSCI_A0->TXBUF='\n'; } }
比如这样,明显的,分号没有来得及发送就被覆盖了。