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