[mw_shl_code=c,true]#if EN_USART1_RX //
void USART1_IRQHandler(void)//接受中断函数
{
u8 Res,i;
#ifdef OS_TICKS_PER_SEC
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //
{
i++;
Res =USART_ReceiveData(USART1);//读取接受到的值
if(i==1&&Res!=0x20)//如果接受到的数据不是0x20开头
{
i=0;//清零
USART_RX_STA=0;//接受错误
return;
}
if(i==2||i==3)//执行这句语句时,说明帧头合法了
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;//装数据
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
}
if(i==4&&Res==0x0A)//如果第四位数据是0x0A
{
i=0;
USART_RX_STA|=0x8000; //接受完成
}
else
{
i=0;//否则接受错误,i 清零
USART_RX_STA=0;//重新接收
}
}
#ifdef OS_TICKS_PER_SEC
OSIntExit();
#endif
}
主函数
int main(void)
{
u8 len,t; //uchar 8bits 0~255
u8 receive[2];
delay_init();
NVIC_Configuration();
LED_Init();
LED_Flash(3);//LED慢闪三次表示开机
uart_init(9600); //波特率9600
while(1)
{
if(USART_RX_STA&0x8000)//检测串口接收标志
{
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//关接收中断
len=USART_RX_STA&0x3fff;/读取字长
for(t=0;t<len;t++)
{
switch (USART_RX_BUF[t])
{
case 0x30:
receive[t]=0;
break;
case 0x31:
receive[t] =1;
break;
case 0x32:
receive[t]=2;
break;
case 0x33:
receive[t]=3;
break;
case 0x34:
receive[t]=4;
break;
case 0x35:
receive[t]=5;
break;
case 0x36:
receive[t]=6;
break;
case 0x37:
receive[t]=7;
break;
case 0x38:
receive[t]=8;
break;
case 0x39:
receive[t]=9;
break;
}
}
USART_RX_STA=0;//清除串口接收状态寄存器
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开串口接收中断
if(10*receive[0]+receive[1]>55)//如果接受到的RSSI大于55
LED_Flash1(3);//快闪报警
}
}
}
[/mw_shl_code]
|