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.

CC2530串口打印的问题

Other Parts Discussed in Thread: CC2530

我每隔10秒产生一个事件,在这个事件中用到了很多串口打印,调试发现每次只能打印到if(MYAPP_HEARTBEAT_FLAG3)中的第一个HalUARTWrite。串口调试助手显示共129个字节,后面的数据没有打印出来。请问该怎么办?

void MyApp_Heart_Check(void)
{
  if(MYAPP_HEARTBEAT_FLAG1) //等于1,标识接收到了心跳包
  {
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t7.txt=\"已入网\"",strlen("page1.t7.txt=\"已入网\"")); HalUARTWrite(0,MyApp_end,3);  
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t7.pco=31",strlen("page1.t7.pco=31"));                 HalUARTWrite(0,MyApp_end,3);  
  }
  else//其他标识未接收到心跳包
  {
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t7.txt=\"未入网\"",strlen("page1.t7.txt=\"未入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t7.pco=31",strlen("page1.t7.pco=31"));                 HalUARTWrite(0,MyApp_end,3);
  }
 
  if(MYAPP_HEARTBEAT_FLAG2) //等于1,标识接收到了心跳包
  {
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t8.txt=\"已入网\"",strlen("page1.t8.txt=\"已入网\"")); HalUARTWrite(0,MyApp_end,3);  
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t8.pco=31",strlen("page1.t8.pco=31"));                 HalUARTWrite(0,MyApp_end,3);      
  }
  else//其他标识未接收到心跳包
  {
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t8.txt=\"未入网\"",strlen("page1.t8.txt=\"未入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t8.pco=31",strlen("page1.t8.pco=31"));                 HalUARTWrite(0,MyApp_end,3);
  }
 
 if(MYAPP_HEARTBEAT_FLAG3) //等于1,标识接收到了心跳包
  {
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t9.txt=\"已入网\"",strlen("page1.t9.txt=\"已入网\"")); HalUARTWrite(0,MyApp_end,3);  
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t9.pco=31",strlen("page1.t9.pco=31"));                 HalUARTWrite(0,MyApp_end,3);      
  }
  else//其他标识未接收到心跳包
  {
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t9.txt=\"未入网\"",strlen("page1.t9.txt=\"未入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t9.pco=31",strlen("page1.t9.pco=31"));                 HalUARTWrite(0,MyApp_end,3);
  }
 
 if(MYAPP_HEARTBEAT_FLAG4) //等于1,标识接收到了心跳包
  {
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t10.txt=\"已入网\"",strlen("page1.t10.txt=\"已入网\"")); HalUARTWrite(0,MyApp_end,3);  
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t10.pco=31",strlen("page1.t10.pco=31"));                 HalUARTWrite(0,MyApp_end,3);  
  }
  else//其他标识未接收到心跳包
  {
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t10.txt=\"未入网\"",strlen("page1.t10.txt=\"未入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t10.pco=31",strlen("page1.t10.pco=31"));                 HalUARTWrite(0,MyApp_end,3);
  }
 
 if(MYAPP_HEARTBEAT_FLAG5) //等于1,标识接收到了心跳包
  {
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t11.txt=\"已入网\"",strlen("page1.t11.txt=\"已入网\"")); HalUARTWrite(0,MyApp_end,3);  
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t11.pco=31",strlen("page1.t11.pco=31"));                 HalUARTWrite(0,MyApp_end,3);   
          
  }
  else//其他标识未接收到心跳包
  {
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t11.txt=\"未入网\"",strlen("page1.t11.txt=\"未入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t11.pco=31",strlen("page1.t11.pco=31"));                 HalUARTWrite(0,MyApp_end,3);
  }
 
  if(MYAPP_HEARTBEAT_FLAG6) //等于1,标识接收到了心跳包
  {
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t12.txt=\"已入网\"",strlen("page1.t12.txt=\"已入网\"")); HalUARTWrite(0,MyApp_end,3);  
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t12.pco=31",strlen("page1.t12.pco=31"));                 HalUARTWrite(0,MyApp_end,3);  
  }
  else//其他标识未接收到心跳包
  {
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t12.txt=\"未入网\"",strlen("page1.t12.txt=\"未入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,MyApp_end,3); HalUARTWrite(0,"page1.t12.pco=31",strlen("page1.t12.pco=31"));                 HalUARTWrite(0,MyApp_end,3);
  }

}

  • 看一下你uartConfig.tx.maxBufSize設置多大
  • 数据能够收到说明串口通信没有问题,排查下buffer大小、速率、接线等问题
  • 能发送部分,说明接线没问题,后面没有了,说明发送缓存超额了。修改一下。改成512试试看。
  • 那个缓存大小,默认是128的,我记得是这样,好久没用过这个了,可以修改成256,512,1024试试看。
    参考
    wenku.baidu.com/.../c5c01620f61fb7360b4c65d9.html
  • uint16 HalUARTWriteISR(uint8 *buf, uint16 len)
    {
    uint16 cnt;

    // Enforce all or none.
    if (HalUARTTxAvailISR() < len)
    {
    return 0;
    }

    for (cnt = 0; cnt < len; cnt++)
    {
    isrCfg.txBuf[isrCfg.txTail] = *buf++;
    isrCfg.txMT = 0;

    if (isrCfg.txTail >= HAL_UART_ISR_TX_MAX-1)
    {
    isrCfg.txTail = 0;
    }
    else
    {
    isrCfg.txTail++;
    }

    // Keep re-enabling ISR as it might be keeping up with this loop due to other ints.
    IEN2 |= UTXxIE;
    }

    return cnt;
    }
    感觉跟HAL_UART_ISR_TX_MAX有关,我将HAL_UART_ISR_RX_MAX 设置为384仍没有改善
    #if !defined HAL_UART_ISR_RX_MAX
    #define HAL_UART_ISR_RX_MAX 384
    #endif
    #if !defined HAL_UART_ISR_TX_MAX
    #define HAL_UART_ISR_TX_MAX HAL_UART_ISR_RX_MAX
    #endif
  • 设置是uartConfig.tx.maxBufSize=512
  • 设置uartConfig.tx.maxBufSize=512還是不行嗎?

  • 對,還是不行。
    我每次串口发送字节数小于30字节,只是连续调用了很多次HalUARTWrite。是不是应该中间有个延迟?
    或者应该在某处,用一段代码把寄存器复位一下?
  • 把你的工程打包发出来,看看TI员工有没有这个板子,帮你测试一下。
  • 太大了,无法发送。
    CC2530+Zstack3.0.2
    options中:
    SECURE=1
    TC_LINKKEY_JOIN
    xPOWER_SAVING
    xLCD_SUPPORTED=DEBUG
    NV_INIT
    NV_RESTORE
    xZTOOL_P1
    xMT_TASK
    xMT_APP_FUNC
    xMT_SYS_FUNC
    xMT_ZDO_FUNC
    xMT_ZDO_MGMT
    xMT_APP_CNF_FUNC
    xLEGACY_LCD_DEBUG
    MULTICAST_ENABLED=FALSE
    ZCL_READ
    ZCL_WRITE
    ZCL_BASIC
    ZCL_IDENTIFY
    ZCL_SCENES
    xZCL_GROUPS
    HAL_LCD=FALSE
    HAL_ADC=FALSE
    HAL_KEY=FALSE
    HAL_UART=TRUE
    HAL_UART_ISR=1
    HAL_UART_DMA=0

    函数很简单
    1、
    void zclGenericApp_Init( byte task_id )
    {
    MyApp_UartInit(); //串口初始化
    ……
    osal_start_timerEx(zclGenericApp_TaskID,MYAPP_AF_HEARTBEAT_EVT,10000);//每隔10秒检测一次
    }
    2、
    uint16 zclGenericApp_event_loop( uint8 task_id, uint16 events )
    {
    ……
    if(events & MYAPP_AF_HEARTBEAT_EVT)
    {
    MyApp_Heart_Check(); //检测,并串口输出
    osal_start_timerEx(zclGenericApp_TaskID,MYAPP_AF_HEARTBEAT_EVT,MYAPP_HEART_TIMES); //10秒检测一次
    return (events ^ MYAPP_AF_HEARTBEAT_EVT);

    }
    ……
    }
    3、
    void MyApp_Heart_Check(void) //纯粹就是串口打印,只执行else中的语句
    {
    if(MYAPP_HEARTBEAT_FLAG1) //等于1,标识接收到了心跳包
    {
    MYAPP_HEARTBEAT_FLAG1 = 0;
    HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t7.txt=\"已入网\"",strlen("page1.t7.txt=\"已入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t7.pco=31",strlen("page1.t7.pco=31")); HalUARTWrite(0,MyApp_end,3);
    }
    else//其他标识未接收到心跳包
    {
    HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t7.txt=\"未入网\"",strlen("page1.t7.txt=\"未入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t7.pco=63488",strlen("page1.t7.pco=63488")); HalUARTWrite(0,MyApp_end,3);
    }

    if(MYAPP_HEARTBEAT_FLAG2) //等于1,标识接收到了心跳包
    {
    MYAPP_HEARTBEAT_FLAG2 = 0;
    HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t8.txt=\"已入网\"",strlen("page1.t8.txt=\"已入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t8.pco=31",strlen("page1.t8.pco=31")); HalUARTWrite(0,MyApp_end,3);
    }
    else//其他标识未接收到心跳包
    {
    HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t8.pco=63488",strlen("page1.t8.pco=63488")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t8.txt=\"未入网\"",strlen("page1.t8.txt=\"未入网\"")); HalUARTWrite(0,MyApp_end,3);
    }

    if(MYAPP_HEARTBEAT_FLAG3) //等于1,标识接收到了心跳包
    {
    MYAPP_HEARTBEAT_FLAG3 = 0;
    HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t9.pco=31",strlen("page1.t9.pco=31")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t9.txt=\"已入网\"",strlen("page1.t9.txt=\"已入网\"")); HalUARTWrite(0,MyApp_end,3);
    }
    else//其他标识未接收到心跳包
    {
    HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t9.pco=63488",strlen("page1.t9.pco=63488")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t9.txt=\"未入网\"",strlen("page1.t9.txt=\"未入网\"")); HalUARTWrite(0,MyApp_end,3);
    }

    if(MYAPP_HEARTBEAT_FLAG4) //等于1,标识接收到了心跳包
    {
    MYAPP_HEARTBEAT_FLAG4 = 0;
    HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t10.txt=\"已入网\"",strlen("page1.t10.txt=\"已入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t10.pco=31",strlen("page1.t10.pco=31")); HalUARTWrite(0,MyApp_end,3);
    }
    else//其他标识未接收到心跳包
    {
    HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t10.txt=\"未入网\"",strlen("page1.t10.txt=\"未入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t10.pco=63488",strlen("page1.t10.pco=63488")); HalUARTWrite(0,MyApp_end,3);
    }

    if(MYAPP_HEARTBEAT_FLAG5) //等于1,标识接收到了心跳包
    {
    MYAPP_HEARTBEAT_FLAG5 = 0;
    HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t11.txt=\"已入网\"",strlen("page1.t11.txt=\"已入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t11.pco=31",strlen("page1.t11.pco=31")); HalUARTWrite(0,MyApp_end,3);
    }
    else//其他标识未接收到心跳包
    {
    HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t11.txt=\"未入网\"",strlen("page1.t11.txt=\"未入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t11.pco=63488",strlen("page1.t11.pco=63488")); HalUARTWrite(0,MyApp_end,3);
    }

    if(MYAPP_HEARTBEAT_FLAG6) //等于1,标识接收到了心跳包
    {
    MYAPP_HEARTBEAT_FLAG6 = 0;
    HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t12.txt=\"已入网\"",strlen("page1.t12.txt=\"已入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t12.pco=31",strlen("page1.t12.pco=31")); HalUARTWrite(0,MyApp_end,3);
    }
    else//其他标识未接收到心跳包
    {
    HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t12.txt=\"未入网\"",strlen("page1.t12.txt=\"未入网\"")); HalUARTWrite(0,MyApp_end,3);
    HalUARTWrite(0,"page1.t12.pco=63488",strlen("page1.t12.pco=63488")); HalUARTWrite(0,MyApp_end,3);
    }
    }
  • 我記得好像不能连续调用HalUARTWrite,建議你把要輸出的信息合成一條一次只调用一個HalUARTWrite
  • 有没有其他办法可以解决?
  • 我将其放在一个数组中,
    uint8 HMI_RuWang_Word[]={ 0x70,0x61,0x67,0x65,0x31,0x2E,0x74,0x31,0x2E,0x74,0x78,0x74,0x3D,0x22,0xD2,0xD1,0xC8,0xEB,0xCD,0xF8,0x22,0xff,0xff,0xff, 0x70,0x61,0x67,0x65,0x31,0x2E,0x74,0x32,0x2E,0x74,0x78,0x74,0x3D,0x22,0xD2,0xD1,0xC8,0xEB,0xCD,0xF8,0x22,0xff,0xff,0xff, 0x70,0x61,0x67,0x65,0x31,0x2E,0x74,0x33,0x2E,0x74,0x78,0x74,0x3D,0x22,0xD2,0xD1,0xC8,0xEB,0xCD,0xF8,0x22,0xff,0xff,0xff, 0x70,0x61,0x67,0x65,0x31,0x2E,0x74,0x34,0x2E,0x74,0x78,0x74,0x3D,0x22,0xD2,0xD1,0xC8,0xEB,0xCD,0xF8,0x22,0xff,0xff,0xff, 0x70,0x61,0x67,0x65,0x31,0x2E,0x74,0x35,0x2E,0x74,0x78,0x74,0x3D,0x22,0xD2,0xD1,0xC8,0xEB,0xCD,0xF8,0x22,0xff,0xff,0xff, 0x70,0x61,0x67,0x65,0x31,0x2E,0x74,0x36,0x2E,0x74,0x78,0x74,0x3D,0x22,0xD2,0xD1,0xC8,0xEB,0xCD,0xF8,0x22,0xff,0xff,0xff
    };
    总共24*6=144个字节
    然后用HalUARTWrite(0,HMI_RuWang_Word,sizeof(HMI_RuWang_Word));输出,串口没有显示。
    经调试
    HalUARTWrite(0,HMI_RuWang_Word,127);可以显示
    HalUARTWrite(0,HMI_RuWang_Word,128);不显示任何数据

    我的初始化函数如下:
    #if !defined( MY_APP_RX_SZ )
    #define MY_APP_RX_SZ 512 //串口接收最大容量
    #endif
    #if !defined( MY_APP_TX_SZ )
    #define MY_APP_TX_SZ 512 //串口发送最大容量
    #endif
    void MyApp_UartInit(void)
    {
    halUARTCfg_t uartConfig;
    uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.
    uartConfig.baudRate = MY_APP_BAUD;
    uartConfig.flowControl = FALSE;
    uartConfig.flowControlThreshold = MY_APP_THRESH; // 2x30 don't care - see uart driver.
    uartConfig.rx.maxBufSize = MY_APP_RX_SZ; // 2x30 don't care - see uart driver.
    uartConfig.tx.maxBufSize = MY_APP_TX_SZ; // 2x30 don't care - see uart driver.
    uartConfig.idleTimeout = MY_APP_IDLE; // 2x30 don't care - see uart driver.
    uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.
    uartConfig.callBackFunc = rxCB; //串口接收到数据时的处理
    HalUARTOpen (HAL_UART_PORT_0, &uartConfig);
    }

    函数HalUARTWrite如下:
    #if !defined HAL_UART_ISR_TX_MAX
    #define HAL_UART_ISR_TX_MAX 512
    #endif
    uint16 HalUARTWriteISR(uint8 *buf, uint16 len)
    {
    uint16 cnt;

    // Enforce all or none.
    if (HalUARTTxAvailISR() < len)
    {
    return 0;
    }

    for (cnt = 0; cnt < len; cnt++)
    {
    isrCfg.txBuf[isrCfg.txTail] = *buf++;
    isrCfg.txMT = 0;

    if (isrCfg.txTail >= HAL_UART_ISR_TX_MAX-1)
    {
    isrCfg.txTail = 0;
    }
    else
    {
    isrCfg.txTail++;
    }

    // Keep re-enabling ISR as it might be keeping up with this loop due to other ints.
    IEN2 |= UTXxIE;
    }

    return cnt;
    }

    请问该怎么办?很着急,是CC2530每次只能输出127个字节么?无法做任何更改?能不能给个建议
  • 我剛剛試著作如下的修改,就可以輸出230bytes
    #define MT_UART_TX_BUFF_MAX 256
    #define MT_UART_RX_BUFF_MAX 256
  • 可以了。谢谢。
    但是还有一个疑问:
    CC2530最多可以输出230个字节。如要要更多的话,就要人为分包发送了是么?
    如果是的话,分包发送的思想是什么?能不能举个例子或者提供一个相关的链接?
  • 127,说明问题不严重,是你没改对地方,要该跟这个函数有关的那个配置值才行。

    看你现在改对了就搞定了,当初你可以跟踪那个函数的,看看那个函数原型调用了哪个宏控制了缓存大小。

  • 我的MT_UART_TX_BUFF_MAX 只有開到256,如果開更大,要輸出多一點應該不是問題
  • 可以考虑用指针分段传送超长的字符串。
  • 这个没弄过,请问有没有相关的讲解或例程?
  • 就開個週期事件,每次串口打印一小段然後更新指针,分段完成串口打印