本帖最后由 Rotor 于 2014-3-3 22:55 编辑
背景:
最近在做一个智能可穿戴设备,现在使用Arduino在做原型demo 设计。
问题:
Arduino每秒采集数据,存放到2*32K的EEPROM 里面。 蓝牙模块的波特率为38400,当手机与蓝牙建立通讯连接时,手机发个特定指令,Arduino 需要读取64K的EEPROM 里面的数据通过蓝牙传给手机。
这里面的问题主要是我一次传输的数据相对比较大。64K/(38400/8) == 13.65 秒,也就是说全速情况下传输需要十秒以上,这样假设蓝牙断了怎么办?假设我手机放了个指令,让传另外的数据,怎么断了这个连接?
提高波特率,最大能提高到多少,能否将数据1秒内能传完?
我现在想的在现有波特率情况下,给数据进行封包,比如128个字节一个包,将64K数据分包传,等于实现类似于tcp的功能,重传纠错等,是否有必要?
不使用封包,可能的问题场景?
1. 比如 Ardunio ------> Phone 与 Ardunio ------> Phone 。当arduino告诉phone 要传64k数据,phone接到命令,开始接收等待,arduino开始传数据,传了一半,断了,这时候phone 还在傻傻的等待数据,这时候等待是无意义的。这种情况该如何处理,做超时??
2. 蓝牙串口传输过程中会不会由于干扰,出现误码? 我在考虑是不是有纠错的必要...
是不是有蓝牙串口的库,我可以研究学习一下,希望大牛们的指点!!!
*******************************************************************
2014-03-03【更新】 下面是一款蓝牙产品的文档 ,对于我自己碰到的问题都有比较好的答案。
串口透传协议说明(桥接模式)
模块的桥接模式是指,通过通用串口和用户 CPU 相连,建立用户 CPU 和移动设备之间 的双向通讯。
用户可以通过串口,使用指定的 AT 指令对串口波特率,BLE 连接间隔进行 重设置。
针对不同的串口波特率以及 BLE 连接间隔,以 及不同的发包间隔,模块将会有不同的数据吞吐能力。在有大数据量传输,或者高实时 性需求的应用中,建议使用高速串口波特率 115200bps。
模块 BLE 连接间隔为 20 ms。此时模块具有最高理论转发能力(4K/S)。这里就 20ms 连接间隔为例,对透传协议做详细介绍。
模块可以从串口一次性最多传输 200 字节数据包,模块会根据数据包大小自动分包发 送,每个无线包最大载荷为 20 个字节。移动设备方发往模块的数据包,必须自行分包(1 -20 字节/包)发送。模块收到无线包后,会依次转发到主机串口接收端。
1. 串口硬件协议:115200 bps , 8, 无校验位,1 停止位 。
2. EN 为高电平,蓝牙模块处于完全睡眠状态。EN 置低时,模块会以 250ms 的间隔开始 广播,直到和手机对接成功。当 EN 从低到高跳变,不论模块状态,会立即进入睡眠。
3. 连接成功之后,主机(MCU)如有数据发送至 BLE 模块,需将 BRTS 拉低,主机可在约 100us 后开始发送数据。发送完毕之后主机应主动抬高 BRTS,让模块退出串口接收模式。 要注意的是,抬高 BRTS 之前请确认串口数据已经完全发送出去,否则会出现截尾现象。 4. 当模块有数据上传请求时,模块会置低 BCTS,最快会在 120us 之后开始发送,直到 数据发送完毕。模块会将 BCTS 置高。
5. 如若主机的 BRTS 一直保持低电平,则蓝牙模块会一直处于串口接收模式,会有较高 的功耗。
6. 在模块连接成功后,会给出 "TTM:OK\r\n\0" 字串,可以根据此字串来确定是否可以 进行正常转发操作。也可以通过手机发送一个确认字串到模块,主机收到后确认已经连 接。
深圳市****科技有限公司
7. 模块的蓝牙默认连接间隔为 20 ms,如果需要节省功耗采用低速转发模式,需通过 AT 指令调整连接间隔(最长连接间隔 2000ms),每个连接间隔最多传输 80 个字节,连接间 隔为 T(单位:ms),那么每秒最高转发速率 V(单位 byte/s)为:
V = 80*1000/T (V 只和 T 有关) 如果模块的蓝牙连接间隔为 20ms,而每个间隔最多传输 80 byte,因此理论最高传输
能力(转发速率)为 80*50 = 4K byte/s。测试表明,转发速率在 2 K/s 以下,漏包机率 较低。安全起见,无论是低速或者高速转发应用,都建议在上层做校验重传处理。
8. 以下是就 20ms 连接间隔的通讯模式举例,也可以自行配置。转发速率 V0 越低,丢包 率越低:
9. 串口数据包的大小可以不定长,长度可以是 200 字节以下的任意值,同样满足以上条 件即可。为最大效率地使用通讯有效载荷,同时又避免通讯满负荷运行,推荐使用 20, 40,60 字节长度的串口数据包。
|