从机向主机发送数据时,数据包会合并或者丢包
我使用2541作为从机向2540主机发送数据,通过串口从2540接收数据,完全单向传输。
每5ms发送一次数据包,一个数据包有7个字节。算下来速度也不算太快,每秒钟7*200=1400个字节
但是从串口收到的数据来看,有时会收到14个字节的数据包,21个字节的也有,甚至是28个字节的。
随之就是字节数为0的空包。
使用的1.3.2协议栈,这是因为传输速率不够导致的吗?
1、首先确定一下,你发这么多字节,是在一个事件中一次发送的,还是状态机轮询发送的
2、如果这么多字节一次性发完,最好计算一下时间,如果一个事件在OSAL中阻塞时间太长,会影响蓝牙的传输
一般不会出现这种情况,请检查您的程序
是当从机被连接后,开始周期事件
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设备的存取速度有关吗?
1、首先,你这个事件这样写有点问题,一般一个事件的是这样的,检测到事件,然后执行,执行完,取消事件标志,你没有取消事件标志
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 );
return ( events ^ SBP_PERIODIC_EVT ); // 加上这一句,不然一旦执行了一次这个事件,完成以后,无论些事件是否发生,
// 只要有任何事件,这个事件都会被执行
}
2、请检查一下这个函数 sbpSerialAppSendNoti(ParamBuffer,sizeof(ParamBuffer));
如果仅仅是设置一个UUID的值,会执行很快的
3、希望可以帮到你,祝你好运!
非常感谢你花费时间来解答!
我的毕业设计中采用了蓝牙传输数据,但对蓝牙没有更深入学习……
这个函数的原型是这样的
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吧?
1、pReport.handle=0x2E;这个是参数的handle值,而非UUID
2、...