u8 USART_RX_BUF[9];//定义接收数组,看传感器返回的有多少字节数据
u8 USART_RX_STA=0;//数组标志位,如第0位、第一位
static char start=0; //开始接收数据标志位
void USART1_IRQHandler(void)
{
u8 Res=0;//定义一个数来接收每次读取的数据
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断,每一个字节都会中断一次
{
Res =USART_ReceiveData(USART1); //读取接收到的字节数据
//接收数据时不要随便加入占用时间的命令,如串口打印,会影响下面数据字节的接收
if(Res == 0x40) //如果接收的第一位数据是0XFF(这个是查看传感器的手册得知的,这里相当于进行校验)
{
start=1; //开始接收数据标志位,一旦第一个接收正确,就就继续向下接收
}
if(start== 1)
{
USART_RX_BUF[USART_RX_STA] = Res ; //把接收到的数据存到数组里面
USART_RX_STA++;//数组标志位加1
if(USART_RX_STA >= 9 && (USART_RX_BUF[1]==0x41))//这里还校验了接收的第二个数据
{
printf("PM2.5:%c\n",USART_RX_BUF[4]);//通过串口1打印接收数组里的数据
USART_RX_STA=0;//重新开始接收
USART_RX_BUF[0] = 0;
start=0;
}
}
while (USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
}
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET)
{
USART_ClearFlag(USART1,USART_FLAG_ORE);
}
}
定义的接收数组u8 USART_RX_BUF[9];,如何在主循环直接调用
while(1)
{
printf("PM2.5:%c\n",USART_RX_BUF[4]);
delay_ms(10000);
}
|