微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 从机向主机发送数据时,数据包会合并或者丢包

从机向主机发送数据时,数据包会合并或者丢包

时间:10-02 整理:3721RD 点击:

我使用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、...

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top