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.

关于zigbee ha1.2协议栈(路由设备)串口接收有时会存在延迟读取串口接收到的数据的问题。

Other Parts Discussed in Thread: CC2530

这个问题是在调试路由设备出现的。(电脑串口助手测试的,串口波特率2400)
1, zigbee ha1.2协议栈串口接收有时会延迟一段时间(大概9秒左右,设备为路由)uartConfig.callBackFunc指向的函数才开始读取串口接收到的数据,不管我用DMA或者ISR工作方式,都有这个问题。这是怎么回事? 。
2,串口工作于DMA方式时,有时发送数据也有延迟(十几秒延迟,时间不定);串口工作于ISR方式时,没有延迟。
       我个人猜想是不是由于串口任务优先级很低,要等待其他事件处理完才会处理串口事件。但是延迟也不至于这么长吧?或者如我猜想的一样,有没改进的方案。
  • 你是用什麼芯片?
  • 你的路由設備会很忙嗎?比如說很多封包会透過它転發
  • 加入网络后只有30秒的定时心跳包发送
  • uartConfig.callBackFunc指向的函数可以貼出來看一下?
  • void MT_UartProcessZToolData ( uint8 port, uint8 event )
    {
    OSALSerialData_t *pMsg;
    uint8 flag=0; //flag 是判断有没有收到数据,j 记录数据长度
    uint8 DataSize=0; //数据大小
    uint8 buf[MT_UART_DEFAULT_MAX_RX_BUFF]; //串口buffer 最大缓冲默认是256,我们这里用256.
    (void)event; // Intentionally unreferenced parameter

    // if (event & HAL_UART_RX_TIMEOUT)
    // {

    while (Hal_UART_RxBufLen(port)) //检测串口数据是否接收完成
    {


    HalUARTRead (port,&buf[DataSize], 1); //把数据接收放到 buf中
    DataSize++; //记录字符数
    flag=1; //已经从串口接收到信息

    }

    if(flag==1) //已经从串口接收到信息
    { /* Allocate memory for the data */
    //分配内存空间,为机构体内容+数据内容+1 个记录长度的数据
    pMsg = (OSALSerialData_t *)osal_msg_allocate( sizeof ( OSALSerialData_t )+DataSize+1);

    pMsg->hdr.event = SERIAL_DATA_MSG; //事件号用原来的CMD_SERIAL_MSG
    pMsg->msg = (uint8*)(pMsg+1); // 把数据定位到结构体数据部分

    pMsg->msg [0]= DataSize; //给上层的数据第一个是长度

    for(uint16 i=0;i<DataSize;i++) //从第三个开始记录数据
    pMsg->msg [i+1]= buf[i];

    osal_msg_send( App_TaskID, (byte *)pMsg ); //登记任务,发往上层
    }
    // }
    // /* deallocate the msg */
    // osal_msg_deallocate ( (uint8 *)pMsg ); //释放内存
    }

    应该不是这个问题,我仿真调试过。断点打在这个函数里,电脑发给该设备发送数据,有时会等几秒才函数。接收到的数据是对的。

  • 你用原始的路由例程也会有同樣的問題?
  • 没有试,我试下
  • 我用TI EVB CC2530DK測試SampleLight 路由都是正常的
  • 嗯,好的我晚些时候测试下,现在在忙其他事情。测出结果了。回复你
  • 不好意思之前忙其他事了,今天才抽出空测试。我也是用ti官网给的例子,发现有时串口没有把缓存的数据发送出去。仿真跟踪代码发现是因为在HalUARTPollDMA()函数里dmaCfg.txShdwValid该位没有关闭(FALSE),导致串口发送没有打开。我把该函数里关于dmaCfg.txShdwValid没有关闭的原因代码贴出来了。

    if (dmaCfg.txShdwValid)
    {
    uint8 decr = ST0;
    decr -= dmaCfg.txShdw;
    if (decr > dmaCfg.txTick)
    {
    // No protection for txShdwValid is required
    // because while the shadow was valid, DMA ISR cannot be triggered
    // to cause concurrent access to this variable.
    dmaCfg.txShdwValid = FALSE;
    }

    }

    这段代码decr可能没有读取到ST0的值或者ST0工作异常,导致dmaCfg.txShdwValid值不能赋值为FALSE,从而不能发送数据。(本来我想用watch查看decr的值和dmaCfg.txShdwValid的值,但是一用watch查看dmaCfg.txShdwValid的值,软件就无响应弹出了。我重装软件还是不行)所以想请问你一下,什么原因会导致decr读取ST0值异常呢?又或者其他原因?

  • 我解决办法就是直接在后面加dmaCfg.txShdwValid = FALSE;这段代码。。不知道会出其他bug不
  • 你好,请问你的这个问题解决了吗,我用的是2.5.1,也遇到了这个问题,我加了dmaCfg.txShdwValid = FALSE;,依然不行