做了一个PC通过串口发送广播数据的实验,实现过程中发现串口发完数据后广播的数据没办法更新,我使用GAP_UpdateAdvertisingData进行更新,simpleBLEBroadcaster_ProcessOSALMsg中加入串口接收的处理函数SerialHandle,实际调试中发现接收完串口的数据后,(此时串口无数据)对SerialHandle又调用了几次,SerialHandle函数具体如下
void SerialHandle(mtOSALSerialData_t *pMsg)
{
uint8 deallocateIncoming;
//if(Serial_flag)
{
uint8 i,len,*str = NULL;
str = pMsg->msg;
len = *str;
uint8 str1[2];
for(i = 1;i<=len;i++)
{ //HalUARTWrite(0,str+i,1);
str1[i-1] = str[i];
}
if(len){
duty = atoi(str1);
Serial_flag = false;
}
VOID osal_msg_deallocate( (uint8 *)pMsg );
deallocateIncoming = FALSE;
}
}
我感到特别困惑,也很着急(快deadline了),希望能得到解答,谢谢!
Yan:
凯文,
貌似是程序的逻辑问题?
不太了解你的程序逻辑,建议看一下程序逻辑,为啥串口处理会被多次调用。
另外,你需要先停止广播,再更新广播内容,然后再使能广播,这样才能用新的广播数据。
Kevin Wang2:
回复 Yan:
感谢Yan的回答,我使用GAP_UpdateAdvertisingData更新广播,在不使用串口的情况下,按键能控制改变广播的内容,当我使用了串口发送数据后,发现按键也不再能改变广播(广播数据advdata能被改变,但是不能更新广播),所以我想请教一下,是否在串口设置或读取数据的过程中,影响了广播的参数设置?我尝试过GAPRole_StartDevice重启广播,结果也不行
Kevin Wang2:
关于本问题的一个解答(参考),对于本问题,在simpleBLEBroadcaster_ProcessOSALMsg函数中,原本是采用case判断串口事件从而进行串口处理,现在我在上述函数中对串口事件不做判断,删除相关case,如下
static void simpleBLEBroadcaster_ProcessOSALMsg( osal_event_hdr_t *pMsg )
{ switch ( pMsg->event ) { #if defined( CC2540_MINIDK ) case KEY_CHANGE: simpleBLEBroadcaster_HandleKeys( ((keyChange_t *)pMsg)->state, ((keyChange_t *)pMsg)->keys ); break; #endif // CC2540_MINIDK default: // do nothing break; }}
将广播更新函数放在(问题中的SerialHandle)放在串口回调函数中,结果广播能够正常更新,希望该方法能给碰到相同问题的朋友一点启发,至于问题的根本原因,希望了解的朋友能继续给予解答
shaokai Lin:
回复 Kevin Wang2:
我觉得就是程序逻辑的问题。
这段函数是该任务接收到msg才会进来的。你串口接收到数据后有发送消息给这个任务吗?
Kevin Wang2:
回复 shaokai Lin:
我尽在串口回调函数中有发送osal_msg_send(registeredSerialTaskID,(uint8 *)pMsgSerial);,
Kevin Wang2:
回复 Kevin Wang2:
现在发送多个数据,就会发生一次发不完,而且接收还会多出一些数据,当我debug,在 if ((numBytes = Hal_UART_RxBufLen(port)) > 0 )这设置断点时,数据能正常接收,只收一次,数据也不会多。所以我又困惑了,翻以前的帖子,发现有人说注释HCI_EXT_ClikDivOnHalfCmd(HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT)这句,但我没有使用(也是没找到)这句,求知道的朋友解答一下
shaokai Lin:
回复 Kevin Wang2:
兄弟,我建议你把一整段代码都贴出来吧。
你这个 if((numbyte = Hal_UART_RxBufLen(port)) > 0)到底写在哪,只有你知道啊。
Kevin Wang2:
回复 shaokai Lin:
抱歉,这个函数式串口回调函数
void sbpSerialAppCallback(uint8 port, uint8 event){ uint8 pktBuffer[SBP_UART_RX_BUF_SIZE]; uint8 flag=0; uint16 numBytes = 0; // unused input parameter; PC-Lint error 715. (void)event; HalLcdWriteString("Data form my UART:", HAL_LCD_LINE_4 ); if ((numBytes = Hal_UART_RxBufLen(port)) > 0 ){ //读取全部有效的数据,这里可以一个一个读取,以解析特定的命令 (void)HalUARTRead (port, pktBuffer, numBytes); HalLcdWriteString(pktBuffer, HAL_LCD_LINE_5 );
sbpGattWriteString(pktBuffer,numBytes); } }
shaokai Lin:
回复 Kevin Wang2:
Hi Kevin
关于HCI_EXT_ClikDivOnHalfCmd(HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT);昨天刚好请教了TI的技术支持。
这个是在CPU空闲时,把主频降低,这样会节约功耗。
你的工程是不是运行在低功耗模式的?
另外,我建议你在初始化时增加这个设置:
HCI_EXT_HaltDuringRfCmd(HCI_EXT_HALT_DURING_RF_DISABLE);