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)
各位TI的工程师你们好,我又实际测试了一下,发现如果一次发送的字符太多就会造成这种情况,最多一次只能发送24个字符,这是因为缓冲区大小的问题吗,有解决的办法吗?希望各位解答。
请问串口是用在从GPS模块读取数据然后通过蓝牙发送出去吗?
建议分开来看这个问题,判断死掉是死在串口读数还是蓝牙发送。
串口的缓冲buffer应该是有定义的, 如果是蓝牙发数据,一个帧只能发20个byte
你好,我读取以后并没有通过蓝牙发出去,我使用串口跟电脑连起来通过串口调试助手测试发现一次发送给cc2640的字节比较少的话cc2640的接收就不会有问题,而比较多就会造成程序死机,而这个数量应该取决于uart的fifo的设置,默认的是1/2full,而我改成了7/8full,确实会使得每次可以发送给2640的数据变多,但是不能超过fifo的7/8,也就是28个。GPS模块一次大约要发100个左右的数据,所以会造成程序的死掉。
建议尝试看能不能自己做一个缓冲区,比如UART每20毫秒读20byte放入缓冲区,供上层使用
但是这样的问题是很可能丢掉一些数据。