使用协议栈为:ZHA1.2
产品进入深度休眠,利用io中断唤醒后,开启工作模式。串口DMA和ISR模式都尝试过了。
if(keys & HAL_KEY_SW_7)
{
osal_pwrmgr_device(PWRMGR_ALWAYS_ON);//工作模式
ZDApp_StartJoiningCycle();//开始寻网
NLME_SetPollRate( 500);
NLME_SetQueuedPollRate( 100);
NLME_SetResponseRate( 100 );
}
然后开始发送串口数据。
设置断点调试,发现程序并没有跑到这里。
case CMD_SERIAL_MSG://模块从串口接收到数据
zclSampleDoorLock_SerialCMD((mtOSALSerialData_t *)MSGpkt);
break;
抓包显示,有Data Request发出。但是并没有发出我想要的数据包。
想问一下,从深度休眠唤醒,是否需要对串口进行处理,才能正常接受数据。
麻烦帮忙分析一下。
YiKai Chen:
深度休眠唤醒調試看一下UART相關的暫存器有沒有在對的設定值,如果不確定就重新設定一下串口
Alvin Chen:
你最好唤醒之后等一下在用UART或者如YK说的重新open一下。
推荐是重新open试试。
user5032796:
回复 YiKai Chen:
我使用的是ZTOOL_P2. 如下为目前使用的配置
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void MT_UartInit ()
{
halUARTCfg_t uartConfig;
/* Initialize APP ID */
App_TaskID = 0;
/* UART Configuration */
uartConfig.configured = TRUE;
uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;//修改波特率57600
uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW;//修改流控FALSE
uartConfig.flowControlThreshold = MT_UART_DEFAULT_THRESHOLD;//64
uartConfig.rx.maxBufSize = MT_UART_DEFAULT_MAX_RX_BUFF;//128
uartConfig.tx.maxBufSize = MT_UART_DEFAULT_MAX_TX_BUFF;//128
uartConfig.idleTimeout = MT_UART_DEFAULT_IDLE_TIMEOUT;//6
uartConfig.intEnable = TRUE;
#if defined (ZTOOL_P1) || defined (ZTOOL_P2)//选择U0&U1端口
uartConfig.callBackFunc =MT_user_UartProcessZToolData;//回调函数
#elif defined (ZAPP_P1) || defined (ZAPP_P2)
uartConfig.callBackFunc = MT_UartProcessZAppData;
#else
uartConfig.callBackFunc = NULL;
#endif
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
回调函数:uint8 buf[128];void MT_user_UartProcessZToolData( uint8 port, uint8 event ){ uint8 flag=0,i,len=0;//flag-判断是否收到数据,len-接收数据长度 (void)event; while(Hal_UART_RxBufLen(port)) { HalUARTRead(port,&buf[len],1); //接收数据,存入buf len++;//记录数据长度 flag=1;//标志-接收到数据 } if(flag==1) { SPI_Msg = (mtOSALSerialData_t *)osal_msg_allocate(sizeof(mtOSALSerialData_t)+len+1);//分配内存 SPI_Msg->hdr.event = CMD_SERIAL_MSG; SPI_Msg->msg = (uint8 *)(SPI_Msg+1); SPI_Msg->msg[0] = len; //0-存数据长度 for(i=0;i<len;i++)//copy数据 { SPI_Msg->msg[i+1] = buf[i]; } osal_msg_send(App_TaskID,(byte *)SPI_Msg); osal_msg_deallocate((uint8 *)SPI_Msg);//释放内存 }}
user5032796:
回复 Alvin Chen:
您指的是重新配置么。楼下是我原来的配置程序。不知道可以更改哪一部分为好。
YiKai Chen:
回复 user5032796:
唤醒之后先呼叫一次MT_UartInit 試試
user5032796:
回复 YiKai Chen:
尝试了一下,确实不可以。对接方的唤醒时序是10ms持续高电平唤醒后20ms后发送数据。不知道调用MT_UartInit();配置完来不来的及。
YiKai Chen:
回复 user5032796:
30ms可能来不及,你可能要自己試試
user5032796:
回复 YiKai Chen:
感谢答复,问题解决了。按键去抖占用25ms,时间缩短正常了。