//串口中断服务函数
void UART5_IRQHandler(void)
{
unsigned char ch;
//接收中断
if ( USART_GetITStatus(UART5, USART_IT_RXNE) != RESET )
{
USART_ClearITPendingBit(UART5, USART_IT_RXNE);
ch = UART5->DR;
switch (g_uart5_ctrl.recv_stau)
{
case PENETRATE_MODE: //当前是透传模式
{
PassThroughRecv(ch, &g_uart5_ctrl);
}
break ;
//以下分支均为命令响应判断
case WAIT_AT :
{
match_cmd_at(ch, &g_uart5_ctrl);
}
break ;
case WAIT_SETMODE: //设置为sta
{
match_cmd_setmode(ch, &g_uart5_ctrl);
}
break ;
case WAIT_SETWIFI: //加入wifi
{
match_cmd_setwifi(ch, &g_uart5_ctrl);
}
break ;
case CHECK_IDADR:
{
match_cmd_check_ipadr(ch, &g_uart5_ctrl);
}
break;
case WAIT_SETTCPINFO: //链接tcp
{
match_cmd_settcpinfo(ch, &g_uart5_ctrl);
}
break ;
case WAIT_SETTCPMODE://设置透传
{
match_cmd_settcpmode(ch, &g_uart5_ctrl);
}
break ;
case WAIT_ANSTOPENETRATE: //等待进入透传数据命令结果
{
match_cmd_cipsend(ch, &g_uart5_ctrl);
}
break ;
#if 0 //直接硬复位
case WAIT_EXITTOPENETRATE: //退出透传
{
}
break ;
case WAIT_GORST: //重启模块
{
}
break ;
case WAIT_GORST:
{
}
break ;
#endif
default :
break ;
}
}
/* 空闲中断 */
if ( USART_GetITStatus(UART5, USART_IT_IDLE) != RESET )
{
USART_ClearITPendingBit(UART5, USART_IT_IDLE);
g_uart5_ctrl.send_flag = 0;
}
/* 串口发送完成中断 */
if ( USART_GetITStatus(UART5, USART_IT_TC) != RESET )
{
/* 清中断 */
USART_ClearITPendingBit(UART5, USART_IT_TC);
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
/* 允许再次发送 */
g_uart5_ctrl.send_flag = 0;
}
}
//回传处理技巧
/********************************************
功能:set wifi命令响应判断(AT+CWJAP+DEF = XXXXXX)
入口:
作者:jzb2019年11月8日
备注:该命令正确响应是 :‘O’‘K’ 掩码2位0x0003
错误响应 FAIL 掩码4位 0xf000
wifi名称和密码是固定死的
********************************************/
void match_cmd_setwifi(unsigned char ch,USART5_CTRL_ST * p )
{
if('O' == ch ||'C' == ch)
{ p->current_mask |= 0x0001; }
else if('K' == ch ||'N' == ch)
{ p->current_mask |= 0x0002; }
if(0x0003 == p->current_mask & 0x0003 ) //响应成功
{p->at_cmd_res = AT_CMD_YES;}
#if 0
//错误响应
if ('F' == ch)
{p->current_mask |= 0x8000; }
else if ('A' == ch)
{p->current_mask |= 0x4000; }
else if ('I' == ch)
{p->current_mask |= 0x2000; }
else if ('L' == ch)
{p->current_mask |= 0x1000; }
if(0xf000 == p->current_mask &0xf000 )//响应失败
{p->at_cmd_res = AT_CMD_FAIL;}
#endif
}
|