初级会员

- 积分
- 77
- 金钱
- 77
- 注册时间
- 2019-5-27
- 在线时间
- 16 小时
|
- void USART1_IRQHandler(void) //串口1中断服务程序
- {
- u8 Res;//用于接收每次发送来的数据(一个数据帧)
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //满足条件说明接收到了一个数据帧,触发了接收中断,这时数据已经传入数据寄存器可以被读取
- {
- Res =USART_ReceiveData(USART1); //读取接收到的数据,暂存到Res中 根据手册25.6.1这一节对寄存器 RXNE位的描述可知,读操作会将该标志位清0
-
- if((USART_RX_STA&0x8000)==0)//接收未完成,最高位没有得到接收完成标志,说明还在接收有效数据,这里认为还没有到达数据末尾,他是全局变量,初始化值为0,所以进入执行语句
- {
- if(USART_RX_STA&0x4000)//第一次接收,判断是否接收到了0x0d ,第一次接收是没有收到回车字符的前半个字符的,直接跳到对应的else
- {
- 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 ;//BUF的下标记录数据的存贮位置,讲RES的数据存在对应下标的数组元素中
- USART_RX_STA++;//更新下标值,等待存取下一个数据
- if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据超出了数组的最大容量,表示数据接收错误,重新开始接收
- }
- }
- }
- }
- }
复制代码 在以上代码中进行了详细的注释,对串口接收中断记录接收数据状态的模拟寄存器进行了理解
|
|