想用蓝牙发送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, ¬i) != SUCCESS) { GATT_bm_free((gattMsg_t *)¬i, ATT_HANDLE_VALUE_NOTI); } } }
里
if(simpleProfile_Notify(peripheralConnList.connHandle, ¬i) != SUCCESS) { GATT_bm_free((gattMsg_t *)¬i, 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'发送?
?MTU总是取两边的较小值,从机你设置了40,主机100,min(40,100) = 40.
改函数定义是不必须的,只需将指针强转为[const] uint8_t*,然后len取2倍就好
BTW,你想一包传40 bytes,MTU最小为43。
仅供参考。
感谢,已解决