在串口中断初始化时,更改初始化中断标志。
原代码:
usart_interrupt_enable(USART1,USART_INT_IDLE);//使用串口空闲中断
改为:
usart_interrupt_enable(USART1,USART_INT_RBNE);//使用读取数据缓冲区非空中断和溢出错误中断
Keil使用“Ctrl+F”搜索就行
此时每个字节都会产生一次中断,在中断函数内再做循环接收即可,可参考以下代码:
uint8_t g_recv_data[256];
uint16_t usart1revlen = 0;
void USART1_IRQHandler(void)
{
if(usart_flag_get(USART1,USART_FLAG_RBNE) != RESET)
{
usart_data_transmit(USART1,usart_data_receive(USART1));//回复串口当前接收的一个字节
g_recv_data[usart1revlen] = usart_data_receive(USART1);//保存接收的一个字节
usart1revlen++;//保存字节数+1
usart_interrupt_flag_clear(USART1,USART_INT_FLAG_RBNE);
}
}
默认会回复所有字节,实际使用时删除这句usart_data_transmit(USART1,usart_data_receive(USART1));
然后把保存的数据在主函数处理就行了。
下面是结果(发送、接收都用的HEX格式):
说说一些坑,USART是没有接收完成这个标志的,例如什么USART_FLAG_TC说的是串口数据发送完成,主函数需要一个串口指令或数据处理时,串口发送就要带结束的字符标志(或者定长字节),假如不加判断,一旦串口发送数据比较快,要不主函数的数据不完整处理出错,要么主函数的数据接收多了处理出错。