我使用2541作为从机向2540主机发送数据,通过串口从2540接收数据,完全单向传输。
每5ms发送一次数据包,一个数据包有7个字节。算下来速度也不算太快,每秒钟7*200=1400个字节
但是从串口收到的数据来看,有时会收到14个字节的数据包,21个字节的也有,甚至是28个字节的。
随之就是字节数为0的空包。
使用的1.3.2协议栈,这是因为传输速率不够导致的吗?
mark_xu:
1、首先确定一下,你发这么多字节,是在一个事件中一次发送的,还是状态机轮询发送的
2、如果这么多字节一次性发完,最好计算一下时间,如果一个事件在OSAL中阻塞时间太长,会影响蓝牙的传输
mark_xu:
一般不会出现这种情况,请检查您的程序
Yi Huo:
回复 mark_xu:
是当从机被连接后,开始周期事件
case GAPROLE_CONNECTED:osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT , 1000 );break;
然后在SimpleBLEPeripheral_ProcessEvent函数的周期事件里循环
if ( events & SBP_PERIODIC_EVT ) { int timer=5; uint8 ParamBuffer[]={0x24,Acce_xh(),Acce_xl(),Acce_yh(),Acce_yl(),Acce_zh(),Acce_zl()}; sbpSerialAppSendNoti(ParamBuffer,sizeof(ParamBuffer)); osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, timer );}
然后在PC上输出每个数据包收到的时间,发现时间间隔都大于10ms。
这可以和i2c设备的存取速度有关吗?
Yi Huo:
回复 mark_xu:
非常感谢你花费时间来解答!!!
我的毕业设计中采用了蓝牙传输数据,但对蓝牙没有更深入学习……
这个函数的原型是这样的
void sbpSerialAppSendNoti(uint8 *pBuffer,uint16 length){ uint8 len; if(length > 20) len = 20; else len = length; static attHandleValueNoti_t pReport; pReport.handle=0x2E; pReport.len = len; osal_memcpy(pReport.value, pBuffer, len); GATT_Notification( 0, &pReport, FALSE );
}
其中pReport.handle=0x2E;就是用到了UUID吧?
mark_xu:
回复 Yi Huo:
1、pReport.handle=0x2E;这个是参数的handle值,而非UUID
2、…