一、代码
u16 count=0;
u16 buff[max];
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=0)
{
Res=USART_ReceiveData(USART1);
if((count&0x8000)==0)//接收未完成
{
if(count&0x4000)//接收到了0x0d
{
if(res!=0x0a) count=0;
else count|=0x8000;
}
else
{
if(res==0x0d) count|=0x4000;
else{
buff[count&0x3fff]=Res;
count++;
if(count>max) count=0;
}
}
}
}
}
二、设计思想
当接收到电脑发送过来的数据,从上述程序可以看出,只要一开始发送过来的数据不是0x0d或者换行,那么我们就将数据保存在一个数组里边,并且进行计数,当检测到有回车时,停止计数。此时等待OXOA的到来,如果没有等到,就认定此次接收失败,需要重新开始接收。如果等到,代表接收成功,将标志位count标记成接收成功状态。
如果迟迟没有检测到回车,那么就将收到的数据存在数组buff里边,直到累计的计数值超过规定的最大数都没有检测到回车,那么会放弃之前接收到的数据,重新开始接收。
总结:当接收到的数据以后,一开始就放在数组里边,但是每一次接收数据放在数组中之前都会去检测一下当前收到的数据是否为回车和换行符,如果是,就会停止保存数据到数组中,认定接收完成。但是一直都没有检测到,那么当数组达到它的最大容量以后,全部清除掉,再重新开始。
引用
正点原子stm32f103最小系统板开发指南(库函数版本);