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

BLEPeripheral工程中,在主APP线程之外的一个线程中调用SetParameter向属性服务器赋值导致蓝牙断开的问题

我在BLEPeripheral工程中使用IIC模块读取一个传感器的值,为了保证读取间隔的准确性,我在SimpleBLEPeripheral_init中新建了一个线程A,新的线程A中使用一个定时器,定时器时间到时,会调用一个函数发送事件到的信号量,在线程A中一直等待这个信号,一旦接收到,就去读传感器数据,然后通过SetParameter函数将数据发送出来。

现在的问题是,在不使能通知的情况下,上述流程可以正常执行,一旦在采集之前通过Central设备使能Peripheral的通知,那么再执行上述过程就会导致蓝牙断开。同时,如果采集之后不调用SetParameter函数,则即使使能通知,也不会断开蓝牙。

部分相关代码:

void pressure_clock_fxn(UArg arg)
{
	Semaphore_post(aps.sem_handle);	
	LED_Control(&handle, 0, LED_TOGGLE);
	return;
}

void SimpleBLEPeripheral_APSTaskFxn(UArg a0, UArg a1)
{
	int16_t pressure;
	float temperature;
	char s[40];
	uint8_t value_to_copy[SIMPLEPROFILE_CHAR6_LEN] = {0xff};
	Semaphore_Params sem_param;
	
	aps.queue_handle = Util_constructQueue(&aps.queue);

	Semaphore_Params_init(&sem_param);
	sem_param.mode = Semaphore_Mode_BINARY;
	aps.sem_handle = Semaphore_create(1, &sem_param, NULL);
	
	Util_constructClock(&aps.clock, pressure_clock_fxn, 500, 500, 0, 0);
	for(;;)
	{
		if ( aps.to_be_deleting )
		{
			break;
		}
		
		// 不处于已连接状态
		if (ble_state != 3)
		{	
			if ( aps.clock.__f4 )
			{
				Util_stopClock(&aps.clock);
			}LED_Control(&handle, 0, LED_TOGGLE);
			Task_sleep(10);
		}
		else
		{
			if ( !aps.clock.__f4 )
			{
				Util_startClock(&aps.clock);
			}

			APS_GetPressureData(&pressure, &temperature);

			memcpy(value_to_copy, &pressure, 2);
			SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR6, 2, value_to_copy);
					
			sprintf(s, "P:%d,T:%.2f\n", pressure, temperature);		
			uart_writeTransport((uint8*)s, strlen(s));
			//Task_sleep(10);
			Semaphore_pend(aps.sem_handle, BIOS_WAIT_FOREVER);
		}
	}

	// 删除定时器
	Queue_destruct(&aps.queue);
	Semaphore_delete(&aps.sem_handle);
	Clock_destruct(&aps.clock);

	aps.to_be_deleting = false;
	return;
}


void SimpleBLEPeripheral_createAPSTask(void)
{Task_Params taskParams;APS_Init();// Configure taskTask_Params_init(&taskParams);taskParams.stack = aps.task_stack;taskParams.stackSize = APS_TASK_STACK;taskParams.priority = 3;Task_construct(&aps.task, SimpleBLEPeripheral_APSTaskFxn, &taskParams, NULL);
}

void SimpleBLEPeripheral_deleteAPSTask(void)
{aps.to_be_deleting = true;//while(aps.to_be_deleting);Task_sleep(1);APS_Uninit();Task_destruct(&aps.task);
}

主设备可以通过发送KS来开始数据采集与发送,发送TZ来终止数据采集与发送。

请诸位帮忙分析一下原因,不胜感激。

Viki Shi:

新建任务请按照如下文档的说明: processors.wiki.ti.com/…/Adding_BLE_Enabled_RTOS_Task

赞(0)
未经允许不得转载:TI中文支持网 » BLEPeripheral工程中,在主APP线程之外的一个线程中调用SetParameter向属性服务器赋值导致蓝牙断开的问题
分享到: 更多 (0)