TI中文支持网
TI专业的中文技术问题搜集分享网站

cc2640串口使用回调函数过一会程序会死掉

各位TI工作人员你们好,我现在使用cc2640的串口,就是官方给的UART.c和UARTCC26XX.c文件,使用回调模式进行读写,将GPS模块的数据读出来再传到电脑上,但是程序泡一会就会死掉,只能传输一个数据,然后就死掉了,也没有广播了,不知道是怎么回事,在社区搜索类似的帖子,有一个人跟我问题差不多但是没有人回复,希望有人解答,谢谢。

这是串口的函数

static void uartRcvDoneCb(UART_Handle uartHandle, void *buf, size_t count)
{
  /*if ((*Rev_Buf == '$') && (gps_flag == 0))  //如果收到字符'$',便开始接收            {
   rev_start = 1;
   rev_stop  = 0;
  }
 
  if (rev_start == 1)  //标志位为1,开始接收             {
   rev_buf[num++] = *Rev_Buf;  //字符存到数组中             if (*Rev_Buf == '\n')     //如果接收到换行             {
    rev_buf[num] = '\0';
    rev_start = 0;
    rev_stop  = 1;
    gps_flag = 1;
    num = 0;
   }
  }*/
      bspUartWrite(rev_buf,1);
      bspUartRead(rev_buf,1);
}
void bspUartInit(void)
{
      UART_init();
  UART_Params_init(&uartParams);
  uartParams.baudRate=9600;
  uartParams.readCallback = uartRcvDoneCb;
  uartParams.readMode = UART_MODE_CALLBACK;
 // i2cParams.bitRate = I2C_400kHz;
  uartHandle = UART_open(Board_UART, &uartParams);
  if (uartHandle == NULL)  {
    Task_exit();
  }
}

这是simpleBLEperipheral.c中的初始化和读函数

  // Register callback with SimpleGATTprofile
  SimpleProfile_RegisterAppCBs(&SimpleBLEPeripheral_simpleProfileCBs);
#endif //!FEATURE_OAD

  // Start the Device
  VOID GAPRole_StartDevice(&SimpleBLEPeripheral_gapRoleCBs);

  // Start Bond Manager
  VOID GAPBondMgr_Register(&simpleBLEPeripheral_BondMgrCBs);
  //bspI2cInit();
   //adcvalue=AdcOneShotRead(ADC_COMPB_IN_VDDA3P3V);
    bspUartInit();
    bspUartRead(rev_buf,1);
    extern uint8_t rbuf1[2];
    long int t=0;    uchar i,j;
      //PINCC26XX_setOutputValue( IOID_9  , 1);
 
  //  extern const char num[];
   // delay_nms(50) ;
    //Init_1621() ;
    //HT1621_all_on(16);   // Util_startClock(&periodicClock);

#if defined FEATURE_OAD
#if defined (HAL_IMAGE_A)

zhikang yang:

各位TI的工程师你们好,我又实际测试了一下,发现如果一次发送的字符太多就会造成这种情况,最多一次只能发送24个字符,这是因为缓冲区大小的问题吗,有解决的办法吗?希望各位解答。

Barbara Wu:

回复 zhikang yang:

请问串口是用在从GPS模块读取数据然后通过蓝牙发送出去吗?

建议分开来看这个问题,判断死掉是死在串口读数还是蓝牙发送。

串口的缓冲buffer应该是有定义的, 如果是蓝牙发数据,一个帧只能发20个byte

zhikang yang:

回复 Barbara Wu:

你好,我读取以后并没有通过蓝牙发出去,我使用串口跟电脑连起来通过串口调试助手测试发现一次发送给cc2640的字节比较少的话cc2640的接收就不会有问题,而比较多就会造成程序死机,而这个数量应该取决于uart的fifo的设置,默认的是1/2full,而我改成了7/8full,确实会使得每次可以发送给2640的数据变多,但是不能超过fifo的7/8,也就是28个。GPS模块一次大约要发100个左右的数据,所以会造成程序的死掉。

Barbara Wu:

回复 zhikang yang:

建议尝试看能不能自己做一个缓冲区,比如UART每20毫秒读20byte放入缓冲区,供上层使用

zhikang yang:

回复 Barbara Wu:

但是这样的问题是很可能丢掉一些数据。

赞(0)
未经允许不得转载:TI中文支持网 » cc2640串口使用回调函数过一会程序会死掉
分享到: 更多 (0)