UART最基本的函数接口:
1)Send函数功能:将数据写到发送数据寄存器,当移位寄存器空时,自动移到移位寄存器中,移位寄存器会一位一位的将数据移出到TX线上。
2)Receive函数功能:从接收数据寄存器中读取数据(当接收数据寄存器被读取一次后,该寄存器状态为空,再次接收新的数据后,变为非空),当从一个空的接收数据寄存器读取数据时,会产生阻塞。
在某些场景下(比如,用AT指令查询蓝牙的名称时),接收数据时,不能确定数据的长度,因此接收长度设置会偏大。此时,接收时会产生阻塞,为避免阻塞的产生,可以增加超时或接收结束标志来中断无效的接收。
void uart_receive(uint8_t * indata, uint8_t len)
{
for (uint8_t i = 0; i < len; i++) {
indata[i] = usart_read(UART3);
if (indata[i] == 'O'){
i++;
indata[i] = usart_read(UART3);
if (indata[i] == 'K'){
i++;
indata[i] = usart_read(UART3);
i++;
indata[i] = usart_read(UART3);
break;
}
}
}
}
比如上面这段程序,当接收到O和K这两个字符时,说明接收快结束了,接收完字符'\r'和'\n'后,接收结束,通过break中断接收。