USART1_IRQHandler(void)函数:
当串口1发生了相应的中止,就会跳到改函数履行。这儿规划了一个小小的接纳协议(体系并未界说):经过这个函数,合作一个数组USART_RX_BUF[ ],一个接纳状况寄存器USART_RX_STA完结对串口的数据的接纳办理。USART_RX_BUF[ ]最大值为64,也便是一次接纳的数据最大不能超越64字节。USART_RX_STA是一个接纳状况寄存器,其各位的界说如表所示:
(留意:这个是作者规划的协议,怎样判别串口接纳一组数据结束?因为每次接纳的数据长度不一样,少的就3个8位数据,多的时分有十多个,这个数据个数是不定的,且没规则的数据,有什么好的办法让它接纳完好?
协议的规划思路如下:
当接纳到从电脑发过来的数据,把接纳到的数据保存在 USART_RX_BUF 中,一起在接纳状况寄存器(USART_RX_STA)中计数接纳到的有用数据个数,当收到回车(0X0D,0X0A)的第一个字节 0X0D时,标志位即第六方位1,计数器将不再添加,等候 0X0A的到来,而假如 0X0A 没有来到,则以为这次接纳失利,从头开端下一次接纳。假如顺畅接纳到 0X0A,则符号 USART_RX_STA的第七位,这样完结一次接纳,并等候该位被其他程序铲除,然后开端下一次的接纳,而假如迟迟没有收到 0X0D,那么在接纳数据超越 64 个了,则会丢掉前面的数据,从头接纳。因为这个寄存器是作者界说,咱们了解时或许简单模糊,其实这个跟一般寄存器相似,只不过是作者界说了一个8位数,规则了它每位的界说,前两位是两个个标志位,后六位用来计数,这样就好了解了。函数代码如下:
- voidUSART1_IRQHandler(void)
- {
- u8res;
- if(USART1->SR&(1<<5))//接纳到数据USART1应该是作者界说的一个结构体,内含各个寄存器
- {
- res=USART1->DR;
- if((USART_RX_STA&0x80)==0)//接纳未完结
- {
- if(USART_RX_STA&0x40)//接纳到了0x0d
- {
- if(res!=0x0a)USART_RX_STA=0;//接纳过错,从头开端
- elseUSART_RX_STA|=0x80;//接纳完结了
- }else//还没收到0X0D
- {
- if(res==0x0d)USART_RX_STA|=0x40;
- else
- {
- USART_RX_BUF[USART_RX_STA&0X3F]=res;
- USART_RX_STA++;
- if(USART_RX_STA>63)USART_RX_STA=0;//接纳数据过错,从头开端接纳
- }
- }
- }
- }
- }
其实咱们能够不必协议法