试图将字节从外设发送到中心(DA14580到智能手机)

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
6个帖子/ 0新
最后一篇
马哈居
离线
最后一次露面:2年4个月前
加入:2018-01-29 01:08
试图将字节从外设发送到中心(DA14580到智能手机)

我正在尝试从BLE芯片向智能手机向智能手机发送N个字节,在从智能手机中收到BLE芯片中的一组字节,即,我的预期操作顺序如下:

智能手机 - > DA14580芯片 - >智能手机

我已经做到了第一部分(智能手机-BLE- > DA14580芯片),但我不知道如何做第二部分

我正在修改ble_app_peripheral样本程序

我在user_custs1_impl.c中取消了void app_adcval1_timer_cb_handler()的代码,并尝试修改它,但它不起作用(即,我的智能手机上的Buttom BLE接收应用程序不会检测到任何东西)
(我也确定这不是智能手机应用程序的问题,因为它可以检测来自另一个自定义BLE模块的BLE数据,我的目标是创建我自己的版本的自定义模块)

这是我的代码:

void user_server_rx_data_ind_handler(ke_msg_id_t const msgid,
struct musts1_val_write_ind const * param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
ARCH_PRINTF(“功能%s \ n \ r”,__func__);
// DO操作:只显示数据
for(int i = 0; iLength; i ++){
ARCH_PRINTF(“\ TPARAM->值[%d] =%d(0x%x)\ n \ r”,i,param-> value [i],param-> value [i]);
}

// 2018-02-12:i2c将字节发送到外部开发
//将接收的字节数组的数据部分发送到I2C从地址
arch_printf("Writing to I2C: Add: %d value: %d\n\r", I2C_SLAVE_ADDRESS, param->value[(param->length) - 1]);
i2c_write_mine(i2c_slave_address,param-> value [(param-> length) - 1]);

// 2018-02-20:来自论坛帖子(https://support.dialog-semiconductor.com/ble-transmission
// *************************************定制价值1 ********************************* //
struct custs1_val_ntf_req* req = KE_MSG_ALLOC_DYN(custs1_val_ntf_req,
task_custs1,
task_app,
custs1_val_ntf_req,
def_user_server_tx_data_char_len);

arch_printf("Inside %s\n\r\tCUSTS1_VAL_NTF_REQ = %d\n\r\ ttask_cust1 = %d\n\r\tTASK_APP = %d\n\r\tDEF_CUST1_ADC_VAL_1_CHAR_LEN = %d\n\r",__func__, CUSTS1_VAL_NTF_REQ, task_cust1, TASK_APP, DEF_USER_SERVER_TX_DATA_CHAR_LEN);
静态UINT16_T样本[20];
for (int i = 0;我< 20;我+ +)
{
样本[i] = 65 + i;
}

申请- > conhdl = app_env - > conhdl;
// req-> handle = cust1_idx_adc_val_1_val;// 2018-02-20:orig
申请- >处理= USER_IDX_SERVER_TX_DATA_VAL;
// req->length = DEF_CUST1_ADC_VAL_1_CHAR_LEN;// 2018-02-20:orig
申请- >长度= DEF_USER_SERVER_TX_DATA_CHAR_LEN;
// memcpy(req->value, &sample, DEF_CUST1_ADC_VAL_1_CHAR_LEN);// 2018-02-20:orig
Memcpy(req->值,&sample,def_user_server_tx_data_char_len);

ke_msg_send(要求的);

arch_printf("I2C数据发送完成\n\r");
}

user_server_rx_data_ind_handler()是当da14580从ble收到字节时调用的自定义函数(此函数在user_catch_rest_hndl()中调用user_peripheral.c中的一个,其中一个switch()...案例块

USER_IDX_SERVER_TX_DATA_VAL在user_custs1_def.h中定义,作为CUST1_IDX_ADC_VAL_1_VAL旁边的一个枚举。这个枚举条目是根据ble_peripheral_app教程创建的。与此同时创建的其他枚举是:

user_idx_server_tx_data_char,
USER_IDX_SERVER_TX_DATA_VAL,
user_idx_server_tx_data_ntf_cfg,
user_idx_server_tx_data_user_desc,
基本上,我已经尝试使它与CUST1_IDX_ADC_VAL_1_*相同

DEF_USER_SERVER_TX_DATA_CHAR_LEN在user_custs1_def.h中定义为
#define def_user_server_tx_data_char_len 20.

我遵循的ble_peripheral_app教程如下
Training_03_custom_profile_gatt_cmd_example_v1 pdf 0.

我想我忽略了一些最基本的东西。我如何从BLE芯片发送一个字节的数据到智能手机?

- - 编辑 - -
这将导致UART终端输出如下:

Inside user_server_rx_data_ind_handler.
CUSTS1_VAL_NTF_REQ = 55300
TASK_CUSTS1 = 54
task_app = 50.
def_cust1_adc_val_1_char_len = 20.
I2C数据发送已完成

它还导致user_peripheral.c中的呼叫呼叫user_catch_rest_hndl()函数

进入user_catch_rest_hndl:
是否= 0 xd805
检测到Msg_Param-> Handle = 27

——编辑2——
还将以下条目添加到user_custs1_def.c文件的struct attm_desc_128 custs1_att_db [cust1_idx_nb] =结构定义:

//用户服务器TX数据特征声明
[USER_IDX_SERVER_TX_DATA_CHAR] = {(uint8_t*)&att_decl_char, ATT_UUID_16_LEN, PERM(RD, ENABLE),
sizeof (user_server_tx_data_char), sizeof (user_server_tx_data_char), (uint8_t *) &user_server_tx_data_char},

//用户服务器TX数据特征值
//可能必须在此处启用NTF权限;如果需要稍后回到这一点
[user_idx_server_tx_data_val] = {user_server_tx_data_uuid_128, att_uuid_128_len, perm (rd, enable) | perm (ntf, enable),
DEF_USER_SERVER_TX_DATA_CHAR_LEN 0零},

//用户服务器TX数据特征配置描述符
[USER_IDX_SERVER_TX_DATA_NTF_CFG] = {(uint8_t*)&att_decl_cfg, ATT_UUID_16_LEN, PERM(RD, ENABLE) | PERM(WR, ENABLE),
sizeof (uint16_t), 0,零},

//用户服务器TX数据特征用户描述
[USER_IDX_SERVER_TX_DATA_USER_DESC] = {(uint8_t*)&att_decl_user_desc, ATT_UUID_16_LEN, PERM(RD, ENABLE),
sizeof(USER_SERVER_TX_DATA_USER_DESC) - 1, USER_SERVER_TX_DATA_USER_DESC}

设备:
PM_DIALOG.
离线
最后一次露面:1天2小时前
职员
加入:2018-02-08 11:03
嗨mahaju,

嗨mahaju,

ble_app_peripheral包含可写特性,如控制点和可读通知特性,如ADC VAL 1。中央处理器可以从某个设备写入一个特性,而该设备可以从中央处理器通知某个特性。

在您的应用程序中,当您通过BLE从智能手机发送消息到DA14580 SoC时,这是一个可写的特征。在另一方面,当您向智能手机发送DA14580 SoC的消息时,这是一个通知的特征,您必须启动通知。

请检查通知是否已激活。

由于PM_dialog

马哈居
离线
最后一次露面:2年4个月前
加入:2018-01-29 01:08
HI I启用通知

嗨I启用了对话框芯片代码中的通知,如下所示:

struct susts1_val_set_req * msg_en_notf = ke_msg_alloc_dyn(custs1_val_set_req,
task_custs1,
task_app,
custs1_val_set_req,
0x2);
静态uint16_t enable_notif;
启用_notif = 0x0001;
// enable_notif [0] = 0x01;
// enable_notif [2] = 0x00;

msg_en_notf - > conhdl = app_env - > conhdl;
msg_en_notf-> handle = user_idx_server_tx_data_ntf_cfg;
// msg_en_notf->句柄= USER_IDX_SERVER_TX_DATA_VAL;
msg_en_notf - > = 0 x2长度;//使用与上面KE_MSG_ALLOC_DYN()参数相同的值
memcpy(msg_en_notf->值,&enable_notif,0x2);

ke_msg_send(msg_en_notf);

每当我需要从BLE芯片向智能手机发送一些东西时,我都会调用这个代码块,并且我能够在我的智能手机应用程序中查看我从BLE芯片发送的数据

这是正确的方法吗?我尝试在user_periphera .c中的user_app_init()中调用这个函数,但它没有工作。

PM_DIALOG.
离线
最后一次露面:1天2小时前
职员
加入:2018-02-08 11:03
嗨mahaju,

嗨mahaju,

不,这不是一个正确的方法。正确的方法是主站应启用指示/通知特性。在您的实现中,您已完成相反的操作,您将从代码中编写通知属性。根据BLE规范,主设备启用通知属性,因此您必须从智能手机应用程序启用通知。
当您在User_App_Init()函数中调用代码块时,它的预期它不起作用。首先调用user_app_init(),然后重置BLE堆栈。重置后,您将丢失所有数据,并且放电BLE堆栈。

由于PM_dialog

马哈居
离线
最后一次露面:2年4个月前
加入:2018-01-29 01:08
嗨抱歉以下

很抱歉这么晚还在追问这个问题,但我还有一个问题

如果我理解正确的话,只需要使用智能手机中的android功能就可以启用通知功能

这是正确的吗?我需要在对话框程序中添加一些额外的代码来接受和处理来自智能手机的“通知启用”命令吗?

PM_DIALOG.
离线
最后一次露面:1天2小时前
职员
加入:2018-02-08 11:03
嗨mahaju,

嗨mahaju,

是的,没错。你应该使用你的移动BLE应用程序启用通知,但你的特征应该是可通知的,你不应该在你的代码中添加任何额外的东西,配置文件将管理这一点。我建议您检查SDK的ble_app_peripheral示例。这个示例包含一个可通知特性(ADC VAL 1特性)的实现。

由于PM_dialog