本实验需要用到两个特征值, 两个特征值的属性各不相同, 我们同样在 SimpleGATTProfile 中新建即可, 接下来就开始吧 新建特征值表 : 表 3.3 串口透传特征值属性 长度 属性 UUID 功能 (byte) SIMPLEPROFILE_CHA R6 15 可读可写 FFF6 服务器

Similar documents
謙卑的小巨人 文 / 林士涵 印製見證文集是父親在生病後就有的想法 目的是希望更多親朋好友能透 過這些見證認識主耶穌 一起享受屬耶穌那好得無比的生命 我的父親林進聰 民國 42 年 9 月 18 日生於台中縣大肚 鄉 退伍後輾轉來到工業技術研究院化工所上班 認識了他生 命中兩個最愛 信仰耶穌基督以及

Guava学习之Resources

範本檔

糖尿病食譜


Microsoft Word 養生與保健_中山大學_講義


萬里社區老人健康照護手冊

Microsoft Word - 強制汽車責任保險承保及理賠作業處理辦法 doc

Microsoft Word - 06.Understanding of Pregnancy and Birth.doc

(➂)11. 炎 炎 夏 日, 即 使 下 起 滂 沱 大 雨, 都 消 除 不 了 令 人 心 煩 的 暑 氣 這 句 話 主 要 想 表 達 什 麼? ➀ 夏 日 裡 經 常 下 著 滂 沱 大 雨, 令 人 心 煩 ➁ 下 著 滂 沱 大 雨 的 日 子, 可 以 消 除 暑 氣 ➂ 夏 日

附 件 一 : 办 理 集 中 式 银 期 转 账 业 务 网 点 名 单 序 号 地 区 网 点 名 称 地 址 联 系 人 电 话 23 工 商 银 行 安 徽 省 铜 陵 百 大 支 行 铜 陵 市 长 江 东 路 50 号 鲁 桂 珍 工 商 银 行 安 徽

2. 二 年 級 吳 毓 秀 老 師 : 感 謝 午 餐 公 司 平 時 均 能 準 時 送 餐, 但 希 望 能 不 要 使 用 加 工 品, 且 學 生 反 映 希 望 能 多 加 蛋 品 的 食 物 3. 三 年 級 柯 阿 青 老 師 : 雞 肉 有 血 水 味, 請 午 餐 公 司 能 調

高雄市立五福國民中學九十四學年度第一學期第三次段考二年級本國語文學習領域試題卷

人 物 春 秋 杨 永 泰 将 其 削 藩 策 略 概 括 为 : 以 经 济 方 法 瓦 解 冯 玉 祥 的 第 二 集 团 军, 以 政 治 方 法 解 决 阎 锡 山 的 第 3 集 团 军, 以 军 事 方 法 解 决 李 宗 仁 的 第 四 集 团 军, 以 外 交 方 法 对 付 张 学

台北老爺校外實地參訪結案報告



,,,,,,, (,, ),,,,,,,,,,,,,,, ,,, 4 11,, ( ),,,, ( ), :, ( ),,, 1995, 66 ; ( ),, 1996, , 3-4,,


2002 4,,, 1941,,,,,,,,,,,,,,,,,, : ;:, 1991,

Microsoft Word 箕æ−¥ï¼‹å®ı稿;

98年度即測即評學科測試與即測即評即發證技術士技能檢定簡章

CC213

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二


概述

政府再造的基本精神:小而美或小而能?

untitled

《C语言程序设计》教材习题参考答案

云商城

Java

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

前 言 随 着 移 动 互 联 网 行 业 竞 争 的 不 断 加 剧, 大 型 移 动 互 联 网 企 业 间 并 购 整 合 与 资 本 运 作 日 趋 频 繁, 国 内 优 秀 的 移 动 互 联 网 企 业 愈 来 愈 重 视 对 行 业 市 场 的 研 究, 特 别 是 对 企 业 发 展

Microsoft Word - 01.DOC

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

投影片 1

壹、


25.( 0 在 進 行 水 溫 與 溶 解 量 的 實 驗 時, 每 一 匙 糖 都 要 刮 平 的 主 要 目 的 為 何? 1 避 免 一 次 溶 解 太 多 糖 2 可 以 增 加 溶 解 糖 的 次 數 3 控 制 加 入 的 每 一 匙 糖 都 一 樣 多 4 可 以 減 少 溶 解 量

《计算概论》课程 第十九讲 C 程序设计语言应用

PTR89 应用程序编程接口 V1.00

Ps22Pdf

先生別耍我

Ps22Pdf

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

投影片 1


小班上学期课程

标题

微雪电子 Open103Z 实验手册 Open103Z 实验手册 目录 准备工作 BitIO-Pushbutton... 3 ADC+DMA... 4 CAN-LoopBack... 5 DAC... 6 DS18B GPIO_Key_L

+!"# $%# "& (") $* (+) "!!* ",, "% + (,) () "!!$ () (),*** () ( ) "!!- +**".$% %*** "*** % (%) "*

2009三季报全文.doc

TD

PowerPoint 簡報


Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

创 刊 词 载 着 春 的 潮 气 蓬 勃, 民 信 成 立 在 2012 年 的 百 卉 含 英 中, 历 经 夏 的 孕 育, 冬 的 贮 藏, 如 今, 再 到 春 华 秋 实 季, 时 逢 中 秋 佳 节, 民 信 迎 来 了 自 己 的 内 刊 民 信 期 刊 有 如 呱 呱 坠 地 的

1

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

微雪电子 Open407V-D 实验手册 Open407V-D 实验手册 目录 准备工作... 2 ADC+DMA... 2 CAN1 TO CAN2-Normal... 3 DCMI_OV DCMI_OV I2C... 6 L

实验一ATOS点对点通信实验.pptx

Microsoft Word doc

Microsoft PowerPoint - 7小時最養生.pps

<4D F736F F D203938ABFCA6D2BEFAA576ACE3A873A5CEB8D5A8F7A977BD5A2E646F63>

新・明解C言語入門編『索引』

《C语言程序设计》第2版教材习题参考答案


中華民國 第51屆中小學科學展覽會


薪 酬 政 策 機 構 就 如 何 釐 定 在 職 者 報 酬 水 平 而 制 訂 的 方 針, 當 中 可 能 包 括 以 市 場 薪 酬 的 某 一 水 平 作 為 參 考 依 據 ( 如 中 位 值 ) 目 標 薪 酬 水 平 包 含 最 高 和 最 低 薪 酬 的 薪 幅 為 現 金 津 貼

<4D F736F F D20D5E3BDADBBECC4FDCDC1D0ADBBE1BCF2B1A8B5DA34C6DA2E646F63>

Microsoft Word - 197次行政會議紀錄.doc

构建 Bluetooth 移动应用 主讲人 : 任凯 微信 :kaiser-tech 2016 年 5 月 6 日 3

保母人員丙級應檢資料第二部份 doc

Corporate Profile

Book1

untitled

目 錄 1. 蒸 豬 肉 丸 2. 蜜 汁 腰 果 3. 鳳 梨 蝦 球 4. 金 菇 扒 芥 菜 5. 松 鼠 黃 魚 6. 椒 鹽 魷 魚 7. 時 蔬 燴 蝦 丸 8. 粉 蒸 小 排 骨 9. 酥 炸 黃 魚 條 10. 彩 椒 炒 魷 魚

untitled

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

校园之星

工 序 的 是 ( ) A. 卷 筒 切 筒 装 药 造 粒 B. 搬 运 造 粒 切 引 装 药 C. 造 粒 切 引 包 装 检 验 D. 切 引 包 装 检 验 运 输 7. 甲 公 司 将 其 实 施 工 项 目 发 包 给 乙 公 司, 乙 公 司 将 其 中 部 分 业 务 分 包 给

专题一.ppt


... 12

如何科学饲养肉兔

<4D F736F F D20BEF7A8AEBE72B7D3A4E2A555A4CEB8D5C3442E646F63>

Microsoft Word - PHP7Ch01.docx

Car DVD API User Manual V0.2 Feb 03, 2008

本科学生毕业论文

没有幻灯片标题


C O N T E N T S ( ) P.3 P.4 P.5 P.8 ( ) P.9 P.13 ( ) ( ) P.14 P P.16 P.17 ( ) P.18 ( ) P.19 P.20 P.21 P.24 P.25 P.26

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft Word - 消息机制.doc

头部


一 公 司 特 殊 问 题 问 题 1 关 于 公 司 的 业 务 及 持 续 经 营 能 力 2013 年 度 2014 年 度 2015 年 1-11 月, 公 司 的 营 业 收 入 分 别 为 1,630, 元 699, 元 73, 元 报 告 期 内,

Transcription:

串口透传 前言 : 有了上面的基础, 接下来就可以打造无线串口功能了 实现平台 :WeBee CC2540 模块及功能底板 图 3.117 网蜂 CC2540 模块及功能底板实验现象 : 两台 PC 通过串口连接 CC2540, 通过设置好串口调试助手, 就可以相互收发信息 也可在一台 PC 利用两个串口实现这个功能 实验讲解 : 整个实验用到两个模块, 一个作为服务器 一个作为客户端, 重点为下面两个方向 : 1 客户端接收串口数据并写入特征值 2 服务器接收串口数据并写入特征值, 再通知主机

本实验需要用到两个特征值, 两个特征值的属性各不相同, 我们同样在 SimpleGATTProfile 中新建即可, 接下来就开始吧 新建特征值表 : 表 3.3 串口透传特征值属性 长度 属性 UUID 功能 (byte) SIMPLEPROFILE_CHA R6 15 可读可写 FFF6 服务器接收客户端的串口 数据 SIMPLEPROFILE_CHA 15 不能直接读写, FFF7 客户端接收服务器的串口 R7 通过通知发送 数据 1.1.1 客户端接收串口数据并写入特征值 如何新建特征值我们上一节讲得很清楚了,SIMPLEPROFILE_CHAR6 可以直接利用上一节中新建的特征值, 这里把字长改为 15 即可, 并在 static void simpleprofilechangecb( uint8 paramid ) 函数中添加 CHAR6 改变的处理函数, 这里是串口输出, 我们的格式是 : 串口数据的长度 ( 1 Byte) + 数据 ( 14 Byte) 1. case SIMPLEPROFILE_CHAR6: // 串口透传 Profile 2. char newchar[15]; 3. SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR6, newchar); 4. if( newchar[0] >= 15 ) 5. { 6. HalUARTWrite(0,&newchar[1],14); 7. HalUARTWrite(0,"...\n",4 ); 8. } 9. else 10. { 1

11. HalUARTWrite(0,&newchar[1],newchar[0]); 12. } 13. break; 接下来是 simpleblecentral 的写入 : 图 3.118CHAR6 接收 在对 CHAR1 的写入代码中 1. // Do a write 2. attwritereq_t req; 3. 4. req.handle = simpleblecharhdl; // 这个是在哪里得到的? 5. req.len = 1; 6. req.value[0] = 0x00; 7. req.sig = 0; 8. req.cmd = 0; 9. GATT_WriteCharValue( simplebleconnhandle, &req, simplebletaskid ); 2

进入 static void simpleblegattdiscoveryevent( gattmsgevent_t *pmsg ) 函 数 图 3.119 读取 Handle 图 3.120 已获取 CHAR1 handle 3

这里我们就可以明白 simpleblecharhd1 何来了, 把这段改为我们需要的读取 CHAR6 的 Handle 然后调用 GATT_ReadUsingCharUUID( simplebleconnhandle, &req, simplebletaskid ); 就可以获取到该特征值的属性 图 3.121 读取 CHAR6Handle 值 下一步就是串口的接收与 CHAR6 的写入, 直接来分析代码 1. uint8 gstatus; 2. static void simplebleperipheral_handleserial(mtosalserialdata_t *cmdmsg) 3. { 4. uint8 i,len,*str=null; //len 有用数据长度 5. uint8 CMD; 6. str=cmdmsg->msg; // 指向数据开头 7. len=*str; //msg 里的第 1 个字节代表后面的数据长度 8. 4

9. if ( ( simpleblestate == BLE_STATE_CONNECTED ) && ( simpleblecharhd6!= 0 ) ) // 写 char6 10. { 11. uint8 ValueBuf[SIMPLEPROFILE_CHAR6_LEN]; 12. 13. if ( len >= SIMPLEPROFILE_CHAR6_LEN ) len = SIMPLEPROFILE_CHAR6_LEN; 14. else len += 1; 15. for(i=0;i<=len;i++) 16. ValueBuf[i] = str[i]; 17. 18. gattpreparewritereq_t req; 19. 20. req.handle = simpleblecharhd6; 21. req.len = SIMPLEPROFILE_CHAR6_LEN; 22. req.offset = 0; 23. req.pvalue = osal_msg_allocate(simpleprofile_char6_len); 24. osal_memcpy(req.pvalue,valuebuf,simpleprofile_char6_len); 25. GATT_WriteLongCharValue(simpleBLEConnHandle, &req, simplebletaskid ); 26. 27. } 28. else 29. { 30. HalUARTWrite(0,"Not Connect\n", 12 ); 31. } 32. 33. } 5

第 9 行 : 判断是否处于连接状态并且以获取 CHAR6 的 handle 值第 18-23 行 : 设置对应的参数第 24 行 : 将串口的数据赋给发送数组中第 25 行 : 调用 GATT 层中的 API 写入特征值 下载连接后, 在 simpleblecentral 模块中通过串口发送小于 15 字节的数据, 就可以在 SimpleBLEPeripheral 的串口输出中看到对应的数据, 到这里就实现 了第一个方向的传输 图 3.122 单方向透传测试 可在 SimpleBLEPeripheral 中看到的串口输出 : 6

图 3.123 接收成功 7

1.1.2 服务器接收串口数据并写入特征值, 再通知主机 下面主要注意一下第二个特征值的添加, 特别是其属性, 他的属性与 CHAR4 的一样, 这里可以参考一下 下面主要看一下和之前的差别之处 : 图 3.124CHAR7 属性 bstatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value ) 函数中 8

图 3.125CHAR7 通知 具体代码 1. else if ( ( pmsg->method == ATT_HANDLE_VALUE_NOTI ) ) // 通知 2. { 3. //CHAR7 的通知 串口打印 4. if( pmsg->msg.handlevaluenoti.handle == 0x0038) { 5. if(pmsg->msg.handlevaluenoti.value[0]>=15) 6. { 7. HalUARTWrite(0,&pMsg->msg.handleValueNoti.value[1],14 ); 8. HalUARTWrite(0,"...\n",4 ); 9. } 10. else 11. { 12. HalUARTWrite(0,&pMsg->msg.handleValueNoti.value[1], 13. pmsg->msg.handlevaluenoti.value[0] ); 14. } 15. } 9

16. } 第 1 行 : 判断是否为通知事件第 4 行 : 判断是否为 CHAR7 写入事件第 5-9 行 : 如果串口接收的数据大于 15, 则只能显示部分数据第 9-14 行 : 显示串口接收到的全部数据 这两处就是最大的区别, 当服务器端自己把数据改变时, 客户端并不会自己主动来读取数据的变化, 这里就有一个通知机制, 服务器要接收到 CHAR7 是否改变, 就需要打开对 CHAR7 的通知, 就是在 CHAR7 的 Handle+1 写入 0x0001 下面就进入 SimpleBLECentral 工程中, 我们利用按键 S1 来使能这个通知 图 3.126 使能 CHAR7 通知 具体代码 : 1. if ( keys & HAL_KEY_SW_1 ) 2. { 3. /* 使能通知 Char7 */ 10

4. uint8 ValueBuf[2]; 5. gattpreparewritereq_t req; 6. 7. req.handle = 0x0039; 8. req.len = 2; 9. ValueBuf[0] = 0x01; 10. ValueBuf[1] = 0x00; 11. req.offset = 0; 12. req.pvalue = osal_msg_allocate(2); 13. osal_memcpy(req.pvalue,valuebuf,2); 14. GATT_WriteLongCharValue( simplebleconnhandle, 15. &req, simplebletaskid ); 16. 17. HalUARTWrite(0,"Enable Notice\n", 14 ); 18. } 第 7 行 : 选择要打开通知的特征值 handle 第 9-10 行 : 赋给对应的命令, 这里是打开通知, 即 0x0001 第 14 行 : 调用 API 使能 CHAR7 的通知 使能通知后, 当服务器端有数据更新的通知会在哪里得到, 这就要找到 static void simpleblecentralprocessgattmsg( gattmsgevent_t *pmsg ) 函数, 这个函数式对 GATT 的事件进行处理的, 包括通知 在函数中添加如下 : 11

图 3.127CHAR7 接收 这里就完成 SimpleBLECentral 端的数据接收处理 最后一步就是 SimpleBLECentral 工程 的串口接收了 具体代码 : 1. static void simplebleperipheral_handleserial(mtosalserialdata_t *cmdmsg) 2. { 3. uint8 i,len,*str=null; //len 有用数据长度 4. str=cmdmsg->msg; // 指向数据开头 5. len=*str; //msg 里的第 1 个字节代表后面的数据长度 6. 7. // 串口透传 设置 char7 参数 8. { 9. uint8 charvalue7[simpleprofile_char7_len]; 10. 12

11. if ( len >= SIMPLEPROFILE_CHAR7_LEN ) len = SIMPLEPROFILE_CHAR7_LEN; 12. else len += 1; 13. for(i=0;i<=len;i++) 14. charvalue7[i] = str[i]; 15. 16. SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR7, 17. SIMPLEPROFILE_CHAR7_LEN, charvalue7 ); 18. } 19. 20. } 第 16 行 : 将接收到的数据写入特征值 接收到串口数据后马上更新 CHAR7 的数据, 这时就会调用到刚才的函数通知客户 端 图 3.128CHAR7 通知 13

至此第二个方向就完成了 下载后等待连接完成, 按下客户端的 S1 按键, 就可在 simpleblecentral 端或 SimpleBLEPeripheral 端中通过串口发送小于 15 字节的数据, 并可从对方的串口输出中看到对应的数据 图 3.129 按键使能通知 simpleblecentral 端 14

SimpleBLEPeripheral 端 图 3.130 simpleblecentral 端透传测试 图 3.131 SimpleBLEPeripheral 端透传测试 到这里就完成两个方向的传输, 相应的我们的串口透传已完成测试 15