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.

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

Other Parts Discussed in Thread: CC2640, CC2650

请教各位大神,我在调试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();
}

}

另外一种方法:

我还尝试了下面链接中添加串口方式:www.deyisupport.com/.../83016.aspx 我添加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;
}

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

  • 说明一下:

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

    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();//开始扫描设备

    }

  • Hi Aaronga

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

  • Hi Aaronga,

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

    Brs,