SimpleProfile_SetParameter跟不上
[敘述]
血壓計 --> MCU uart --> SimpleProfile_SetParameter() --> Phone
NPI uart接收到來自血壓的data後,透過SimpleProfile_SetParameter()傳到Phone
uart約每14ms 接收1筆16bytes data
[問題]
發現上述方式會"偶發性"造成2640在接收、傳輸中突然像shutdown(估且稱作shutdown)一樣停止動作。
非一定在第n筆data發生,但一定在傳輸過程中。
[測試]
1、[Pass]懷疑血壓計端有問題
試過當2640 shutdown時量測血壓計仍有吐data,但2640 uart已不接收
2、[Pass]懷疑2640 uart, 因此排除BLE send to Phone
只要uart 收到data後不跑SimpleProfile_SetParameter就不會發生shutdown事件
3、[???]懷疑2640 SimpleProfile_SetParameter()處理速度跟不上uart接收data的速度
測試1、在uart接收後delay 1x ~ 3xms,發現delay時間愈接近3xms,愈不會發生shutdown現象
血壓計 --> MCU uart --> delay 20~30ms --> SimpleProfile_SetParameter() --> Phone
測試2、當量測開始時,假設uart會接收1000筆data(不delay),我讓前200筆data透過SimpleProfile_SetParameter()送到手機,
第201筆之後data不跑SimpleProfile_SetParameter(),目的是排除BLE連線問題可能,結果不會有shutdown現像
[結論]
綜合上述測試,看來問題很像是SimpleProfile_SetParameter()來不及處理uart 進來的data,導致shutdown,
請問是否有其它建議,或該如何解決??
謝謝
一般来说,串口手法速率大于蓝牙转发速率,所以会出现串口没问题但蓝牙传输衔接不上的问题。
CC2640的throughput请看这边: https://github.com/ti-simplelink/ble_examples/blob/master/docs/throughput_example.md
謝謝你的幫忙,是走notification,昨天試著將SimpleProfile_SetParameter()搬到其它地方測試,
發現即使不delay也不會shutdown,又推翻之前的認知。
看來如下(目前)做法是不可行的,但不知為何??
static void TLpacketParser()
{
len = TLgetRxBufLen();
.....
TLread(RxBuf, len);
SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR6, len, RxBuf); <=== 看來不能直接send to phone
}
我也遇到了这个问题 UART收到数据多了 蓝牙在给主机发送数据的时候 出现丢包的情况 而且是固定包
感觉串口收的太快了 蓝牙发送的速度跟不上 但是串口收到的数据是完整的
我也是加TASK_SLEEP才能完整发送数据 但是数据很慢 用NOTIFY方式
现在在改用INDICATE方式发送 但是改为INDICATE后程序直接飞了 正在找原因ING,。。。
Hi Yulei
你之後都要改INDICATE方式嗎?
我有試著改len送到BLE結果不會當,並移掉sleep…方式如下
TLpacketParser()
{
uint16_t len = TLgetRxBufLen();
if (len >= APP_TL_BUFF_SIZE)
{
len = APP_TL_BUFF_SIZE //16
}
TLread(appRxBuf, len);
len = 10; <==== appRxBuf接進來的len會是16,我只送10到BLE卻不會當
SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR6, len, &appRxBuf);
}
----------------------------------------------------------
您說的:"UART收到数据多了 蓝牙在给主机发送数据的时候 出现丢包的情况"
我也懷疑過…但如將SimpleProfile_SetParameter移到taskFxn()的loop傳送給定16bytes data,而Rx仍然接收data,
這樣卻不會當…無法說明"uart收多ble會丟包"
後續有何進展再煩請互相share吧
你好:
我想用INDICATE方式是因为NOTIFY没有RESPONSE 无法检测主机是否收到导致丢包
但是目前程序不正常 还在找原因
您所说的SimpleProfile_SetParameter放在LOOP里面 一直发送数据 主机就不会丢包吗?
难道是因为SimpleProfile_SetParameter放的位置不对?我之前是串口收到数据后 直接发送给主机
Hi Yulei
是的,放taskFxn() loop裡,當Rx接data到停止的時間裡,loop裡都會透過SimpleProfile_SetParameter()發送給固定data(buf[16] = {0x11....})
如前文,我也是串口uart一收到數據就直接發送
------------------------------------
但我也測試過…如將uart收到的data在taskFxn() loop透過SimpleProfile_SetParameter()發送,卻會當,
這也是我不解之處(您可以試試)。
目前我會著重在len = 10;就正常的地方,感覺像是某個buf或length沒有控管好