新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2020-8-20
- 在线时间
- 12 小时
|
1金钱
本帖最后由 couragemars 于 2021-3-13 23:53 编辑
- void USART1_IRQHandler(void) //串口1中断服务程序
- {
- u8 Res;
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ //接收中断(接收到的数据必须是0x0d 0x0a结尾)
- Res =USART_ReceiveData(USART1);//(USART->DR); //读取接收到的数据
- if((USART_RX_STA&0x8000)==0){//接收未完成
- if(USART_RX_STA&0x4000){//接收到了0x0d
- if(Res!=0x0A)USART_RX_STA=0;//接收错误,重新开始
- else USART_RX_STA|=0x8000; //接收完成了
- }else{ //还没收到0X0D
- if(Res==0x0D)USART_RX_STA|=0x4000;
- else{
- USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; //将收到的数据放入数组
- USART_RX_STA++; //数据长度计数加1
- if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
- }
- }
- }
- }
- #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
- OSIntExit();
- #endif
- }
复制代码 这是原子哥教程串口实验源码里的中断程序,我在主程序里判断数组内容,程序如下:
- while(1)
- {
- if(USART_RX_STA&0x8000)
- {
- if(USART_RX_BUF[0]==0x31 && USART_RX_BUF[1]==0x32 && USART_RX_BUF[2]==0x33)
- {
- USART_RX_STA=0;
- delay_ms(50);
- printf("321\r\n");
-
- }
- if(USART_RX_BUF[2]==0x34 && USART_RX_BUF[3]==0x35 && USART_RX_BUF[4]==0x36)
- {
- USART_RX_STA=0;
- delay_ms(50);
- printf("654\r\n");
- }
- // len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
- // for(t=0;t<len;t++)
- // {
- // USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
- // while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
- // }
- USART_RX_STA=0;
- }
- }
复制代码 接收到123时,单片机回复321,接收到456时,单片机回复654。由于我屏蔽了将数组内容返回的代码,当我上一次发送123并回复321后,如果我接着发送0x0d 0x0a,单片机依然会回复321,而不是无反应,换成456也是这样,这与我想象的不同,
思来想去,清除标志位是不影响缓存的数组内容,可标志位从零开始了,那下一次接受数据应该会直接覆盖呀?就算发送的是回车换行,没有数据不覆盖,上一次的数组也不可能还保留标志位啊,这是为啥?
|
|