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

cc2640 主机串口读数据回调函数问题

请教各位大神,我在调试cc2640主机串口程序的时候遇到一个奇怪的问题:

1.串口程序放在从机程序下,收发都正常。

2.主机程序中添加串口程序,发送数据正常,如果在回调函数中将收到的数据直接发送回去,不做其他处理,也正常,pc端100ms发送间隔发送,收发都正常。

3.串口回调函数中调用开启扫描的函数,同时在按键处理程序下也有该函数的调用,也就是,上电之后,我可以通过串口命令开启扫描,也可以通过按键开启扫描,扫描结果通过串口打印出来.问题出现了:如果我上电之后只按按键,不发串口命令,程序始终是正常的 ,每按一次按键,串口总能收到扫描结果。但是只要一发数据,程序就死了,再按按键也没反应  了。

代码如下:

/*********************串口初始化*/

UART_Params_init(&SbpUartParams);
SbpUartParams.baudRate = 115200;
SbpUartParams.readDataMode = UART_DATA_BINARY;
SbpUartParams.writeDataMode = UART_DATA_BINARY;
SbpUartParams.dataLength = UART_LEN_8;
SbpUartParams.stopBits = UART_STOP_ONE;
SbpUartParams.readMode = UART_MODE_CALLBACK;
SbpUartParams.readEcho = UART_ECHO_OFF;
SbpUartParams.readCallback = readCallback;

SbpUartHandle = UART_open(CC2650_UART0,&SbpUartParams);
if(SbpUartHandle)
HalLedSet(HAL_LED_1 | HAL_LED_2 | HAL_LED_3 | HAL_LED_4, HAL_LED_MODE_ON);
// Enable RETURN_PARTIAL
UART_control(SbpUartHandle, UARTCC26XX_RETURN_PARTIAL_ENABLE, NULL);
// UART_read()
UART_read(SbpUartHandle, rxBuf, 20);

/*****************串口回调函数****/

static void readCallback(UART_Handle handle, void *rxBuf, size_t size)
{

// Wake up the application.
Semaphore_post(sem);
// Start another read, with size the same as it was during first call to
// UART_read()
UART_read(handle, rxBuf, 20);
//rxBuf="hello\r\n";
UART_write(SbpUartHandle, rxBuf, 20);
//handleAtCMD(rxBuf);
HalLedSet(HAL_LED_1 , HAL_LED_MODE_TOGGLE);

//以下代码都屏蔽,按键能正常开启扫描,串口也能正常将数据发送回去。

/*SYS_STATE = SYS_Scaning;
discoveryDevice();//直接开始扫描设备,程序死掉

*/
//SimpleBLECentral_enqueueMsg(SBC_UART_CHANGE_EVT,SUCCESS, NULL); //通过消息触发,程序死掉
//events |= SBC_UART_CHANGE_EVT;//通过事件开启扫描,程序死掉
}

/*****************开启扫描函数***********/

static void discoveryDevice(void)
{
if ( !simpleBLEScanning )
{
simpleBLEScanning = TRUE;
simpleBLEScanRes = 0;

uart_SendData("STAT: DIS-ON\r\n",14);

GAPCentralRole_StartDiscovery( DEFAULT_DISCOVERY_MODE,
DEFAULT_DISCOVERY_ACTIVE_SCAN,
DEFAULT_DISCOVERY_WHITE_LIST ); }
else
{
simpleBLEScanning = FALSE;
GAPCentralRole_CancelDiscovery();
}

}

另外一种方法:

我还尝试了下面链接中添加串口方式:http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/83016.aspx?pi2132219853=2。此方式遇到的问题是, 我添加c文件和h文件后,在maim函数中添加task,SimpleBLECentral_createTask()和Uart_createTask();只能存在一个,两个同时存在,两个就都不能跑,屏蔽掉一个,另外一个就能正常跑。代码如下:

int main()
{
PIN_init(BoardGpioInitTable);

#ifndef POWER_SAVING
/* Set constraints for Standby, powerdown and idle mode */
Power_setConstraint(Power_SB_DISALLOW);
Power_setConstraint(Power_IDLE_PD_DISALLOW);
#endif //POWER_SAVING

/* Initialize ICall module */
ICall_init();
/* Start tasks of external images – Priority 5 */
ICall_createRemoteTasks();
/* Kick off profile – Priority 3 */
GAPCentralRole_createTask();
/* Kick off application – Priority 1 */
SimpleBLECentral_createTask();
//Uart_createTask();//新增加的
/* enable interrupts and start SYS/BIOS */
BIOS_start();
return 0;
}

各位大神有没有调过主机的串口,有调通的请提供一下帮助,谢谢!

aaronga:

说明一下:

/*****************串口回调函数****/

static void readCallback(UART_Handle handle, void *rxBuf, size_t size){

// Wake up the application.Semaphore_post(sem);// Start another read, with size the same as it was during first call to// UART_read()UART_read(handle, rxBuf, 20);//rxBuf="hello\r\n";UART_write(SbpUartHandle, rxBuf, 20);//handleAtCMD(rxBuf);HalLedSet(HAL_LED_1 , HAL_LED_MODE_TOGGLE)

//以下全部屏蔽,按键能开启扫描,串口收发也正常。

/*SYS_STATE = SYS_Scaning; discoveryDevice();//开始扫描设备*/ //直接调用扫描,程序死掉

//SimpleBLECentral_enqueueMsg(SBC_UART_CHANGE_EVT,SUCCESS, NULL); //通过消息触发,程序死掉//events |= SBC_UART_CHANGE_EVT;//通过事件开启,程序也死掉。}

//上电不发串口命令,通过按键开启,能正常开启,只要一发数据,程序就死,再按按键,也不能开启了扫描了。

按键处理函数

if (keys & KEY_UP) { HalLedSet(HAL_LED_1 , HAL_LED_MODE_TOGGLE); SYS_STATE = SYS_Scaning; discoveryDevice();//开始扫描设备

}

Zeiss:

Hi Aaronga

        我用的方法和你的第二种方法一样,不过我的可以正常运行,只不过我把SimpleBLECentral_createTask的优先级改成2,把新task的优先级改为1,并且使用宏关闭了原本工程里一些的外设驱动。

da qin zheng sheng:

回复 Zeiss:

好办法。

syun fe:

回复 aaronga:

Hi Aaronga,

我也遇到了类似的问题,我将task设置成2,也会出现程序死掉的情况。请问您最后解决了?

Brs,

赞(0)
未经允许不得转载:TI中文支持网 » cc2640 主机串口读数据回调函数问题
分享到: 更多 (0)