串口例程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/************************************************************
**函数原型:void UART2_IRQHandler(void)
**函数说明:串口2接收中断处理
**输入参数:无
**输出参数:无
**修 改 人:黄喆(hzh)
**修改日期:2015年1月20日
************************************************************/
void USART2_IRQHandler(void) //串口2中断服务程序
{
u16 r_count;
uint8_t Res;
//u32 testbuf;


if(GL_Usart2_R_Flag >= USART_R_OK)//上一帧数据接收完成未处理
{
if(USART_GetITStatus(USART2, USART_IT_RXNE)!= RESET) //接收中断有效
{
USART_ClearITPendingBit(USART2, USART_IT_RXNE); //清中断标志位
}
}
else//重新开始接收数据帧
{
if(USART_GetITStatus(USART2, USART_IT_RXNE)!= RESET) //接收中断有效
{
Res = USART_ReceiveData(USART2);
if((GL_Usart2_R_Flag == USART_R_START)|(Res == PC_TO_JZQ_HEAD ))
{
GL_Usart2_R_Flag = USART_R_START;//接收到正确字头
GL_Usart2_R_Buf[GL_Usart2_R_conut++] = Res;
if(GL_Usart2_R_conut >= (USART2_R_BUF_MAX - 1))//防止超过最大接收容量
{
USART2_R_again();//重新接收
}
if(GL_Usart2_R_conut >= PC_TO_JZQ_OVER_DATA_count)//当数据超过一定数量 开始处理
{
r_count = GL_Usart2_R_Buf[PC_TO_JZQ_LENGTH_BIT_H];
r_count <<= 8;
r_count |= GL_Usart2_R_Buf[PC_TO_JZQ_LENGTH_BIT_L];
if(GL_Usart2_R_conut >= r_count)//接收完整帧数据
{
if(GL_Usart2_R_Buf[r_count-1] == PC_TO_JZQ_END)//正确结尾帧
{
// testbuf = CRC_CalculateBlockCRC(&GL_Usart2_R_Buf[PC_TO_JZQ_DATA_START_BIT],(r_count-30));//CRC校验
GL_Usart2_R_Flag = USART_R_OK;
//关闭接收中断
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
vTaskResume(xHandle_usart2);//恢复串口处理任务
}
else//重新接收
{
USART2_R_again();//重新接收
}
}
}

}
USART_ClearITPendingBit(USART2, USART_IT_RXNE); //清中断标志位
}
}

}

相关文档
最新文档