27,372
社区成员
发帖
与我相关
我的任务
分享
while(1)
{
if(1==usart_flag)
{
printf("STM32 receive data\r\n");
for(i=0;i<10;i++)
{
printf("0x%x,",usart_buff[i]);
}
printf("\r\n");
usart_flag=0;
}
}
void USART1_IRQHandler(void)
{
u8 key=0;
u16 i=0,j=0;
u8 input=0;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
while(input!=0xaa)
{
input=USART_ReceiveData(USART1);
}//寻找帧头
usart_buff[count++]=0xaa;
printf("get the head\r\n");
key=USART_ReceiveData(USART1);
usart_buff[count++]=key;
printf("key =0x%x\r\n",key);
#if 1
switch(key)
{
case 'o'://接收到PC->STM32板的消息接收成功消息
{
//获取长度
for(i=0;i<4;i++)
{
usart_buff[count++]=USART_ReceiveData(USART1);
}
//获取data,命令O 没有数据
//获取CRC32
for(i=0;i<4;i++)
{
usart_buff[count++]=USART_ReceiveData(USART1);
}
usart_flag=1;
break;
}
default: break;
}
#endif
}
}
void USART1_IRQHandler(void)
{
u8 key=0;
u16 i=0,j=0;
u8 input=0;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
usart_buff[count++]=USART_ReceiveData(USART1);
if(count>8)
{
usart_flag=1;
}
}
}
extern int count;
extern u8 *usart_buff;
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
usart_buff[count++]=USART_ReceiveData(USART1);
}
}
u8 *usart_buff;
u8 count=0;
while(1)
{
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==RESET&&count!=0)
{
for(i=0;i<100;i++)
{
if(usart_buff[i]!=0x0)
{
USART_SendData(USART1,usart_buff[i]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
}
for(i=0;i<100;i++)
{
usart_buff[i]='\0';
}
count=0;
}
}
中断函数:
extern int count;
extern u8 *usart_buff;
void USART1_IRQHandler(void)
{
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==RESET&&count!=0)
{
for(i=0;i<100;i++)
{
if(usart_buff[i]!=0x0)
{
USART_SendData(USART1,usart_buff[i]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
}
for(i=0;i<100;i++)
{
usart_buff[i]='\0';
}
count=0;
}
}
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
usart_buff[count++]=USART_ReceiveData(USART1);
if(count>8)
{
usart_flag=1;
}
}
但我在实际使用过程中,串口确实需要对不同长度的数据进行处理。 现在 我将接收数据内容放到中断里面实现。如下面的代码所示。请问这种情况下,有没有好的方法来实现。
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
while(input!=0xaa)
{
input=USART_ReceiveData(USART1);
}//寻找帧头
usart_buff[count++]=0xaa;
printf("get the head\r\n");
key=USART_ReceiveData(USART1);
usart_buff[count++]=key;
printf("key =0x%x\r\n",key);
switch(key)
{
case 'o'://接收到PC->STM32板的消息接收成功消息
{
//获取长度
for(i=0;i<4;i++)
{
usart_buff[count++]=USART_ReceiveData(USART1);
}
//获取data,命令O 没有数据
//获取CRC32
for(i=0;i<4;i++)
{
usart_buff[count++]=USART_ReceiveData(USART1);
}
usart_flag=1;
break;
}
default: break;
}
}