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

串口收发数据和更新广播数据不能同时进行问题

做了一个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);

赞(0)
未经允许不得转载:TI中文支持网 » 串口收发数据和更新广播数据不能同时进行问题
分享到: 更多 (0)