串口中断接收方式详细比较
串口调试,以前也调过,只是没这么深入的琢磨过,最近又在弄,感觉串口很基本,
也很有学问,要是出现 BUG 可能导致系统奔溃。。。现在贴出来,欢迎拍砖指正!!!
本例程通过 PC 机的串口调试助手将数据发送至 STM32,STM32 通过 SP3232 芯片
采用中断接收方式完成,然后接收数据后将所接收的数据又发送至 PC 机,具体下面详
谈。。。
实例一:
void USART1_IRQHandler(u8 GetData)
{
u8 BackData;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志.
GetData = UART1_GetByte(BackData); //也行 GetData=USART1->DR;
USART1_SendByte(GetData); //发送数据
GPIO_SetBits(GPIOE, GPIO_Pin_8 ); //LED 闪烁,接收成功发送完成
delay(1000);
GPIO_ResetBits(GPIOE, GPIO_Pin_8 );
}
}
这是最基本的,将数据接收完成后又发送出去,接收和发送在中断函数里执行,main
函数里无其他要处理的。
优点:简单,适合很少量数据传输。
缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。
实例二:
void USART2_IRQHandler()
{
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志
Uart2_Bu9er[Uart2_Rx_Num] = USART_ReceiveData(USART2);
Uart2_Rx_Num++;
}
if((Uart2_Bu9er[0] == 0x5A)&&(Uart2_Bu9er[Uart2_Rx_Num-1] ==
0xA5)) //判断最后接收的数据是否为设定值,确定数据正确性
Uart2_Sta=1;