This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

IO唤醒后,串口收不到数据。

使用协议栈为: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发出。但是并没有发出我想要的数据包。

想问一下,从深度休眠唤醒,是否需要对串口进行处理,才能正常接受数据。

麻烦帮忙分析一下。

  • 深度休眠唤醒調試看一下UART相關的暫存器有沒有在對的設定值,如果不確定就重新設定一下串口
  • 你最好唤醒之后等一下在用UART或者如YK说的重新open一下。
    推荐是重新open试试。
  • 我使用的是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);//释放内存

    }
    }

     

  • 您指的是重新配置么。楼下是我原来的配置程序。不知道可以更改哪一部分为好。
  • 唤醒之后先呼叫一次MT_UartInit 試試
  • 尝试了一下,确实不可以。对接方的唤醒时序是10ms持续高电平唤醒后20ms后发送数据。不知道调用MT_UartInit();配置完来不来的及。
  • 30ms可能来不及,你可能要自己試試
  • 感谢答复,问题解决了。按键去抖占用25ms,时间缩短正常了。