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.

MESH1.0 连续使用HalUARTWrite();无法分包通过打印出来。

Other Parts Discussed in Thread: CC2530

描述:协调器发送一条广播消息向多个路由获取数据。

           每次协调器接受到路由的数据后,直接HalUARTWrite();

测试发现:

                  例如想要达到的效果是:RX: 01 00 00 00

                                                              RX: 02 00 00 00

                                                              RX: 03 00 00 00

                   实际打印出来的效果是:RX:01 00 00 00 02 00 00 00 03 00 00 00

自己找了半天资料后,说是HalUARTWrite();只是发送到缓存区?并不是真正的直接发出。

请问如何可以实现上面想要的效果?使用的是CC2530 空间资源实在有限。

  • 无法分包打印出来?

    你这个buffer是可以打印的出来的啊。
  • 这是我实际打印出来的效果(设定128,字节超过,后面的丢失了):
    RX:<--00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 0A
    和预想的应该是
    RX:<--00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    RX:<-- 0A
    RX:<--00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    RX:<-- 0A
    RX:<--00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    RX:<--0A
    RX:<--丢失.....0A
    代码部分:
    uint8 devlist_buf[40]={0}; //缓存
    void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )//接收
    {
        ......
        switch(pkt->cmd.Data[1])
        {
            case 7:
            {
                 //----------------数据存到devlist_buf数组
                for(k=0;k<10;k++)//10组
               {
                    for(h=1;h<100;h++)
                    {
                         if(Buf_Nwk_Addr[h] ==BUILD_UINT16(pkt->cmd.Data[9+k*6],pkt->cmd.Data[10+k*6])&& (Buf_Nwk_Addr[h]!=0))
                        {
                              if((pkt->cmd.Data[13+k*6]==0)&&(pkt->cmd.Data[14+k*6==0]))//如果不在线,清空设备
                             {
                                    devlist_buf[0+k*4] =0;
                                    devlist_buf[3+k*4] =0;
                            }
                            else
                             {
                                   devlist_buf[0+k*4] =h;
                                  devlist_buf[3+k*4] =0x02;
                             }
                             devlist_buf[1+k*4] =pkt->cmd.Data[13+k*6];
                             devlist_buf[2+k*4] =pkt->cmd.Data[14+k*6];

                       }
                 }
            }
            HalUARTWrite(MT_UART_DEFAULT_PORT,devlist_buf,40);//打印列表
            HalUARTWrite(MT_UART_DEFAULT_PORT,"\n",1);//打印回车
            for(i=0;i<40;i++)
            {
                devlist_buf[i]=0;//清零
             }
          }
       }
    }
    叙述:我想是不是接收到数据包的时间间隔太短导致。

  • 因为程序中TX buf就是128超过了必然会丢失,你可以修改tx buf 但是不能太大,过大你的可以用ram 会变小,更容易出现问题。
  • 这个是清楚的,现在空间不足,只能128了。
    所以才有了以上的想法,收到一包数据(40),就打印一包。这样就不会溢出了。
    现在是多包变成了一包,才发出去。
  • 有可能,你可以改一下试试看。
  • 我做了个测试,我使用透传由路由给协调器发送TX:<--01 01,协调器收到后直接打印。
    一、
    以50ms自动发送
    得到的结果是:
    RX:<--01 01 01 01
    RX:<--01 01
    RX:<--01 01 01 01 01 01
    RX:<--01 01 01 01
    RX:<--01 01 01 01
    RX:<--01 01 01 01
    RX:<--01 01 01 01
    RX:<--01 01 01 01
    RX:<--01 01 01 01
    RX:<--01 01 01 01
    RX:<--01 01 01 01
    RX:<--01 01 01 01
    RX:<--01 01 01 01 01 01
    RX:<--01 01 01 01 01 01
    二、
    以150ms自动发送
    得到的结果是:
    RX:<--01 01
    RX:<--01 01
    RX:<--01 01
    RX:<--01 01
    RX:<--01 01
    RX:<--01 01
    RX:<--01 01
    RX:<--01 01
    RX:<--01 01
    RX:<--01 01
    RX:<--01 01
    150ms显示才是正确的。
  • 那有可能就是dma比较慢吧。
  • 那么只能改用ISR或者发送的间隔拉长?
  • 你可以去ISR试一下,因为我自己在使用的时候为了低功耗很少用到UART,你现在什么应用为什么会很频繁的发送数据?
  • 目前完成了,更改为ISR貌似没什么效果,最后只能通过拉长发送间隔,基本实现了功能。感谢您的帮助。