//串口中斷服務函數
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
}
|