因为硬件限制,modem和mcu只能通过1个uart口通讯,MTK平台CMUX默认都是关闭的,所以在使用ATD*99#拨号成功后,AT指令会被堵住
根据MTK的答复有以下3中方法中断数据连接:
主动断开拨号方法:
1. 先下+++切到AT模式,然后下ATH或AT+CGACT=0
2. 在AP端直接发送断开数据连接的数据包
3. 拨号上网,贵司应该会配置一个对应的网络连接,可以在网络连接上直接操作断开。
我无法解析PPP数据,第2点无法验证
第3点经过验证也是可以的,不过方法比较粗暴,作为后续解决方案
直接调用mmi_cnmgr_disconnect_all_bearer_pre_handler的应用层函数,最终发送MSG_ID_MMI_ABM_DISCONNECT_REQ消息中断网络连接
第1点是常规方法,不过测试过程中发现,拨号成功的状态下,如果对方没有任何回复,即没有通过握手进入激活状态,下+++是无效的
尝试修改:
查看代码,整理一下流程,+是作为EscChar,在UART_RecHandler会判断接收的字符是否是EscChar,
/* detect escape sequence */
if (UARTData->Rec_state != UART_RecNormal)
{
if (cRXChar == UARTData->ESCDet.EscChar)
{
UARTData->EscCount++;
if(UARTData->EscCount == 3)
{
UARTData->Rec_state = UART_Get3EscChar;
}
else if(UARTData->EscCount > 3)
{
UARTData->Rec_state = UART_RecNormal;
UARTData->EscCount = 0;
}
}
然后系统会调用UART_Calback,根据UARTData->Rec_state的状态,UART_Get3EscChar发送消息MSG_ID_UART_ESCAPE_DETECTED_IND来中断数据连接
但是在实际测试过程中发现,uart中断并没有调用UART_RecHandler,所以UARTData->Rec_state一直是0,无法发送消息出去
尝试在uart口收到“+++”命令时,直接发送MSG_ID_UART_ESCAPE_DETECTED_IND消息,测试是可以中断数据连接的
UART_Handler函数中SIO_CMD_GET_BYTES状态下判断如果buffer是+++,则直接发送消息
UART_sendilm(uart_port1, MSG_ID_UART_ESCAPE_DETECTED_IND);