u16 UART1 RX STA; 这个状态变量这样用
变量最高位表示数据接收有没有完成?
先定义个协议:数据有0D0A(就是\r\n),表示数据接收结束,就把UART1 RX STA最高位第15位设置为1,否则就是0 :
- ////////////////////////////////////////
- // 串口2中断服务程序
- // 入口参数: 无
- // 函数返回: 无
- ////////////////////////////////////////
- void UART2_ISR(void) interrupt UART2_VECTOR
- {
- //<<AICUBE_USER_UART2_ISR_CODE1_BEGIN>>
- // 在此添加中断函数用户代码
- u8 r= 0;
- if (UART2_CheckTxFlag()) //判断串口发送中断
- {
- UART2_ClearTxFlag(); //清除串口发送中断标志
-
- fPrintfBusy = 0; //清除printf发送忙标志
- }
-
- if (UART2_CheckRxFlag()) //判断串口接收中断
- {
- UART2_ClearRxFlag(); //清除串口接收中断标志
- r= UART2_ReadData();
- if(!(UART2_RX_STA&0x8000)) //判断16位数据UART1_RX_STA最高位是否=1
- {
- if(UART2_RX_STA & 0x4000 ) //判断16位数据UART1_RX_STA次高位是否=1
- //是1的话说明上次接收到的是“0D”
- {
- if(r!=0x0a) UART2_RX_STA=0; //假如现在接收到的不是“0x0a”,说明接收错了,从头再来
- else UART2_RX_STA|=0x8000; //或的目的是最高位置1的同时保留其他位不变
- }
- else //正常接收数据
- {
- if(r==0x0d) UART2_RX_STA|=0x4000; //如果收到的是0x0d,次高置1
- else
- {
- UART2_RX_BUF[UART2_RX_STA&0x3FFF]= r; //接收数据缓冲区,后14位保存数据
- UART2_RX_STA++;
- if(UART2_RX_STA>UART2_REC_LEN-1) UART2_RX_STA=0;
-
- }
-
- }
- }
- }
- //<<AICUBE_USER_UART2_ISR_CODE1_END>>
- }
-
复制代码
上面这段程序在串口1正常运行(当然是把相应的系统函数变成串口1的,标志也是) |