蓝牙发送数据问题

想用蓝牙发送ADC数据,但是只能发单字节,ADC值发不全,该如何修改配置?

修改部分代码可以双字节发全,但是信息会丢失第一个数据的第一个字节,这是为何


想实现功能是接收到特定数据就蓝牙发送ADC值,但是现在是在CHAR1接收数据,在CHAR4发送数据,现在双字节发送出现的问题是,手机在APP读CHAR4数据,只有20个字节而且丢失第一个数据的第一个字节,我想要的效果应该是40个字节且不丢数据,这个20字节是谁限制的?我修改#define SIMPLEPROFILE_CHAR4_LEN     40也没用。


我后面又试着把数组空出一个来输出,发现好像不是数据丢失,是高位在后低位在前了,有程序能更改顺序吗,不能更改我就在接收端处理


需要发送较长数据需要修改MTU,除了你上面提到的#define SIMPLEPROFILE_CHAR4_LEN     40还需要对config.h中的

#ifndef BLE_BUFF_MAX_LEN

#define BLE_BUFF_MAX_LEN                    27

#endif

进行修改。

关于你说的发送接收数据不全的情况,看你的历史发帖程序做出了较大改动,是否可以提供详细的信息,比如将你修改的程序部分,打印数据出现的现象等。


 BLE_BUFF_MAX_LEN    已经修改成为44,和#define SIMPLEPROFILE_CHAR4_LEN     40后接收不到任何数据,#define SIMPLEPROFILE_CHAR4_LEN     20时能够正常接收数据,数据发送没有不全,是因为真实发送的数据 高位在后低位在前(这里是因为什么?蓝牙协议导致的?),我按照一般的想法以为是高位在前低位在后,当时认为是丢了一个高位数据,现在看没有丢失数据,现在问题还是发送长度大了,我通过蓝牙通道4发送出来的数据直接不发送了。


代码方面我修改的performPeriodicTask函数,

static void performPeriodicTask(void)
{
    uint8_t i;
    uint16_t notiData[SIMPLEPROFILE_CHAR4_LEN] ;
    for(i = 0; i < 20; i++)
    {
        notiData[i] = abcBuff[i]; // 连续采样20次

    }
    peripheralChar4Notify(notiData, SIMPLEPROFILE_CHAR4_LEN);
}
abcBuff[]是ADC取到的全局变量


我在找原因时发现是函数

static void peripheralChar4Notify(uint16_t *pValue, uint16_t len)
{
    attHandleValueNoti_t noti;
    if(len > (peripheralMTU - 3))
    {
        return;
    }
    noti.len = len;
    noti.pValue = GATT_bm_alloc(peripheralConnList.connHandle, ATT_HANDLE_VALUE_NOTI, noti.len, NULL, 0);
    if(noti.pValue)
    {
        tmos_memcpy(noti.pValue, pValue, noti.len);
        if(simpleProfile_Notify(peripheralConnList.connHandle, &noti) != SUCCESS)
        {
            GATT_bm_free((gattMsg_t *)&noti, ATT_HANDLE_VALUE_NOTI);
        }
    }
}

if(simpleProfile_Notify(peripheralConnList.connHandle, &noti) != SUCCESS)
        {
            GATT_bm_free((gattMsg_t *)&noti, ATT_HANDLE_VALUE_NOTI);
        }

这一段的问题

bStatus_t simpleProfile_Notify(uint16_t connHandle, attHandleValueNoti_t *pNoti)
{
    uint16_t value = GATTServApp_ReadCharCfg(connHandle, simpleProfileChar4Config);

    // If notifications enabled
    if(value & GATT_CLIENT_CFG_NOTIFY)
    {
        PRINT("noti.pValue open\n");
        // Set the handle
        pNoti->handle = simpleProfileAttrTbl[SIMPLEPROFILE_CHAR4_VALUE_POS].handle;
        PRINT("%x\n",GATT_Notification(connHandle, pNoti, FALSE));
        // Send the notification
        return GATT_Notification(connHandle, pNoti, FALSE);
    }
    return bleIncorrectMode;
}

修改长度会如何影响这里函数的结果?


还有就是这个长度SIMPLEPROFILE_CHAR4_LEN是按字节算的?我想输出20个双字节数据是要改成40吧


接收端MTU改了吗?MTU总是取两边的较小值。


谢谢解答,我测试现在是使用手机APP测试的,APP 修改MTU,我设置100后提示MTU40,这是为何?还有就是APP修改后还是收不到数据


现在问题太多,我想重新开始解决,蓝牙发送uint8_t 怎么变成发送uint16_t?我之前是用修改函数声明,把入参改变,目前看来是失败的,有什么其他的解决办法吗?还是就不这样整个发送数据而是把0x0fff拆成字符'0''F''F''F'发送?


  1. ?MTU总是取两边的较小值,从机你设置了40,主机100,min(40,100) = 40.

  2. 改函数定义是不必须的,只需将指针强转为[const] uint8_t*,然后len取2倍就好


BTW,你想一包传40 bytes,MTU最小为43。


仅供参考。


感谢,已解决


只有登录才能回复,可以选择微信账号登录