NXP的这个BLE蓝牙方案也很有趣, 一起研究.

这个函数在app_gpa_task.c里面

****************************************************************************************
 * @brief Handles create connection request complete event from the GAP.    *//**  处理GAP连接结束后的事件.
 *
 * @param[in] msgid     GAP_LE_CREATE_CONN_REQ_CMP_EVT   参数一是GAP连接请求处理完毕的event的id
 * @param[in] param     Pointer to struct gap_le_create_conn_req_cmp_evt 参数二是这个event的struct的指针.
 * @param[in] dest_id   TASK_APP   目的设备的id
 * @param[in] src_id    TASK_GAP  源设备的id
 *
 * @return If the message was consumed or not.  return是消息是否成功发送.
 * @description
 *
 * This handler is used to inform the application the outcome of connection establishment.
 ****************************************************************************************
 */
#if (!BLE_BROADCASTER && !BLE_OBSERVER)     //确定一下不是广播或者观察设备.
int app_gap_le_create_conn_req_cmp_evt_handler(ke_msg_id_t const msgid, struct gap_le_create_conn_req_cmp_evt const *param,
                                               ke_task_id_t const dest_id, ke_task_id_t const src_id)   //参数跟函数名.
{
    QPRINTF("Connection with %02X%02X%02X%02X%02X%02X result is 0x%x.\r\n",   //打印一下, 这个连接上来的设备是谁, 地址多少, 这个地址会变化, 应该不是mac地址...
        param->conn_info.peer_addr.addr[5],
        param->conn_info.peer_addr.addr[4],
        param->conn_info.peer_addr.addr[3],
        param->conn_info.peer_addr.addr[2],
        param->conn_info.peer_addr.addr[1],
        param->conn_info.peer_addr.addr[0],
        param->conn_info.status);

if (APP_ADV == ke_state_get(TASK_APP))  //这里TASK_APP, 是在一个在ke_task.h的文件里面定义的, 我看了一下, 跟OSAL的定义很像, 定义了一个枚举类型, 里面有两个是app层面的task, 一个叫TASK_APP, 另一个叫TASK_USER, 这里的意思是确定一下当前的state是广告
    {
        ke_state_set(TASK_APP, APP_IDLE);  //既然连接上了, 就把state设置成APP_IDLE
        app_set_role(GAP_PERIPHERAL_SLV);   //然后把角色设置成peripheral还是个slave
    }
    else
    {
        app_set_role(GAP_CENTRAL_MST);   //如果当前不是广告的, 是这个设备主动连的人家, 那就是central+master了.
    }

if (param->conn_info.status == CO_ERROR_NO_ERROR)   //这里是连接出错的处理
    {
        app_set_link_status_by_conhdl(param->conn_info.conhdl, &param->conn_info, true);

// Enable service here, for Server init phase 2
#if (BLE_PERIPHERAL)   //如果设备设置成peripheral, 那么就要启动server, 提供service
        app_enable_server_service(true, param->conn_info.conhdl);
#endif
    }

app_task_msg_hdl(msgid, param);    //这里估计就跟OSAL一样, 将标记恢复成已处理状态, 避免事件被重复执行.
    
    return (KE_MSG_CONSUMED);
}
#endif

上面是连接成功, 紧接着断开就不分析了, 差不多.

来看看写入char的值是如何处理的.

在app_qpps_task.c里面, 有个app_qpps_data_ind_handler的函数.

///Client value send to APP
    QPPS_DAVA_VAL_IND,

****************************************************************************************
 * @brief Handles the data ind message from the QPPS.       *//**
 *
 * @param[in] msgid     QPPS_DAVA_VAL_IND  看上面的define, 内意思, 这个时候, client, 就是手机, 发送了数据给server, 即9020
 * @param[in] param     Pointer to the struct qpps_data_val_ind   数据都在这儿了.
 * @param[in] dest_id   TASK_APP 
 * @param[in] src_id    TASK_QPPS
 *
 * @return If the message was consumed or not.
 * @description
 * This handler is used to handle the data sent form peer device
 *
 ****************************************************************************************
 */
int app_qpps_data_ind_handler(ke_msg_id_t const msgid,
                              struct qpps_data_val_ind *param,
                              ke_task_id_t const dest_id,
                              ke_task_id_t const src_id)
{
    if (param->length > 0)
    {
        QPRINTF("len=%d, I%02X", param->length, param->data[0]);
    }
    QPRINTF("\r\n");

return (KE_MSG_CONSUMED);
}

我xue微的修改一下, 把内容打印一下吧.

unsigned int i;
    QPRINTF("Client sent:");
    if (param->length > 0)
    {
        //QPRINTF("len=%d, I%02X", param->length, param->data[0]);
            for(i=0;i<param->length;i++){
            QPRINTF("%02X ", param->data[i]);
            }
    }
    QPRINTF("\r\n");

欧了.

NXP QN9020的更多相关文章

  1. NXP NFC移植及学习笔记(原创)

    NFC功能介绍 NFC 目前使用的三种功能: 1. P2P模式:基于LLCP协议的基础上,以NDEF数据交换格式来通信. 2. 读写模式:当作为读卡器,对NFC Tag的读写. 3. 卡模拟模式:模块 ...

  2. NXP恩智浦P89V51RB2/RC2/RD2单片机解密芯片破解方法!

    NXP恩智浦P89V51RB2/RC2/RD2单片机解密芯片破解 P89V51RB2/RC2/RD2是一款80C51微控制器,包含16/32/64kB Flash和1024字节的数据RAM. P89V ...

  3. NXP恩智浦P89V52X2单片机破解P89C52X2BA芯片解密技术分享!

    NXP恩智浦P89V52X2单片机破解P89C52X2BA芯片解密 P89V52X2是一款带有8kB Flash.256B数据RAM和192B数据EEPROM的80C51微控制器.这个器件可以在完全替 ...

  4. NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解多少钱?

    NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解 芯片解密型号: P87C51x2.P87C52x2.P87C54x2.P87C58x2.P87C591  单片机解密 #####[ ...

  5. NXP Mifare S50标准IC卡- 访问位(Access Bits) 分析

    Mifare S50 标准IC卡有1K 字节的EEPROM,主要用来存储数据和控制信息.1K 字节的EEPROM分成16 个区,每区又分成4 段,每1段中有16 个字节.每个区的最后一个段叫“尾部&q ...

  6. Cortex-M0(NXP LPC11C14)启动代码分析

    作者:刘老师,华清远见嵌入式学院讲师. 启动代码的一般作用 1.堆和栈的初始化: 2.向量表定义: 3.地址重映射及中断向量表的转移: 4.初始化有特殊要求的断口: 5.处理器模式: 6.进入C应用程 ...

  7. NXP开源自动驾驶计算平台Bluebox 打造现实无人汽车

    知名半导体制造商恩智浦NXP已经准备好了自家的自动驾驶计算开源平台Bluebox,将为汽车制造商提供现成的一体化自动 驾驶计算解决方案.专为自动驾驶设备的BlueBox中央计算引擎.不仅能够为无人驾驶 ...

  8. Cheap CK100 1024 tokens NXP FIX Chip on Eobd2

    CK100 is a well-known and cost-effective key programmer for many cars. Some said it is a must for bo ...

  9. NXP LPC11xx I2C Slave 从机程序

    /**************************************************************************** * $Id:: i2cslave.c 363 ...

随机推荐

  1. 替换SearchBar 键盘上的 搜索 按钮

    for (UIView *searchBarSubview in [searchBar subviews]) {        if ([searchBarSubview conformsToProt ...

  2. python笔记 - day8

    python笔记 - day8 参考: http://www.cnblogs.com/wupeiqi/p/4766801.html http://www.cnblogs.com/wupeiqi/art ...

  3. Which Python memory profiler is recommended

    http://stackoverflow.com/questions/110259/which-Python-memory-profiler-is-recommended/110826#110826

  4. 团队冲刺the second day

    今天是我们的团队冲刺的第二天,由于我的电脑出现了一点问题,系统还原了,我有重新配置了一下环境变量和一些eclipse的问题,导致时间浪费了很多,但是我还是做了一些简单的任务,例如编写节日的页面的布局, ...

  5. QT中静态库的生成与使用

    一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...

  6. 阿里云数据库实例的一个db被开发人员删除了 如何恢复

    1没有 逻辑备份的话. 如下操作即可 可以将那个临时实例的需要导的db用逻辑备份出来恢复到主实例就行了 好多朋友都在问,RDS中把数据恢复到7天内任意时间点的功能在哪里啊? 其实挺简单的,只需要五步操 ...

  7. [SharpDevelop]菜单状态更新

    方式一 在Idle方法中更新 void OnApplicationIdle(object sender, EventArgs e) { // Use the Idle event to update ...

  8. NSString的截取

    // //  main.m //  02-字符串的获取 // //  Created by apple on 14-3-20. //  Copyright (c) 2014年 apple. All r ...

  9. cocos2dx 3.x以上(Sprite精灵类的相关属性与创建)

    // //  MainScene.cpp //  helloworld // //  Created by apple on 16/9/19. // // #include "MainSce ...

  10. lua对模块接口扩展的一种方法

    module lua中模块的实现,对于使用者来说就是一个库,引用此库后,可以调用库中实现的任意函数. 使用库,可以将一类功能相关的接口做封装,并提供开放接口. 参考: http://blog.codi ...