• 蓝牙应用连接的建立

    2005-11-19 17:38:00
    New Page 1 蓝牙协议解决实现了数据和声音的无线传输,并定义了一套包含无线部分、协议、甚至还有应用规范的完整系统。应用规范包括在应用中使用无线和协议组件的方法,并在规范中作了详尽的定义。
    
    
    蓝牙协议解决实现了数据和声音的无线传输,并定义了一套包含无线部分、协议、甚至还有应用规范的完整系统。应用规范包括在应用中使用无线和协议组件的方法,并在规范中作了详尽的定义。

    蓝牙特别兴趣小组定义这些规范的目的就是为了确保不同制造商的蓝牙产品可以相互兼容,具有互操作性。

    如果对蓝牙系统的工作原理缺乏基本的理解,在设计蓝牙解决方案时将会遇到很多困难。设计工程师需要真正了解蓝牙系统是如何工作的,以及如何将多种不同的部分组合成一整套规范。 0201B_DC3_F1-C.JPG

    网络基础知识

    蓝牙设备仅在个人区域网络(PAN)的范围内受到支持,这一点与802.11无线局域网明显不同。在所需功率、实现成本和支持的数据传送速率等方面对二者进行比较,最主要的(也是经常被忽略的)区别在于蓝牙能支持很多在802.11所不能实现的各种独特功能。进一步的区别还在于蓝牙技术可以方便地接入不断变化的应用阵列,这个特点可以用于高度移动的应用。

    在典型的蓝牙网络或者微型网络中,射频连接可以建立在一个主设备和最多7个激活的从设备之间。在允许时,从设备与主设备之间实现通信(见图1),而从设备之间不能直接互相通信。

    如图所示,#7主设备在LAN接入点(LAP)所能覆盖的10米范围之外。进入服务区时,PDA就会与LAP建立连接,并根据LAP的命令从主设备转变为从设备(假设其身份为第7号激活从设备)。在这个站中,它将作为客户利用LAP提供的服务。

    这一过程看似简单,实际上包含了多个步骤,这些步骤在应用软件中实现。

    蓝牙系统的设计工程师应该牢记一些影响系统性能的问题,例如RF链路预算和带宽共享。蓝牙设备规定的工作半径为10米,这是由于必须延长电池的使用寿命,但是也允许设计更大发射功率的蓝牙单元,将覆盖面积扩展到半径100米。由于非移动设备可以利用交流电源,所以电池寿命并不成为问题。但是这种大功率和低功率的混合使用(如LAP)将会产生RF功率不均衡的通讯链路。此时为了建立无线链路,单元之间的距离必须等于或小于10米。

    无线链路能支持的主设备到从设备之间最大数据传输速率为723.2kbps,从设备到主设备的最大传输速率为57.6kbps。

    应该注意该带宽由微型网内所有激活的从设备共享。另外一种数据链路配置(还有其他多种不同的配置)支持均衡数据流,在两个相反的方向上均能达到433.9 kbps。数据传输速率由主控制器(无线硬件)严格限制,同时也在一定程度上受到蓝牙堆栈和应用代码上层的影响。

    具有基本堆栈的协议在不同程度上推进了由堆栈功能定义的网络连接的发展(见图2)。基带和无线硬件可以控制跳频和时分双工操作,实现对通讯信道的支持。由于这一层的功能对设计工程师来说是透明,设计工程师不必深入了解该部分的原理。 0201B_DC3_F2-C.JPG

    链路管理协议(LMP)是协议链中的底层部分。该部分负责很多功能,包括认证、加密使能、维护以及无线链路的控制等。这些功能由应用软件来管理。

    主控制器接口(HCI)是允许主控制器(无线硬件)与通常运行在另一个处理器上的蓝牙协议堆栈的上层进行通讯的接口。在开发蓝牙解决方案的时候,这一点尤为重要,因为该接口允许无线硬件跨越硬件边界与上层堆栈和应用软件相集成,这些应用软件通常基于通用异步收发器(UART)或USB接口。

    逻辑链路控制和适配协议(L2CAP)作为可以建立点到多点的数据链路层协议(一个主设备带多个从设备),将数据包分割和重组,将上层协议(如RFCOMM和服务发现协议(SDP))汇集或混合在一块,并为输入数据指定合适的协议。

    RFCOMM是与堆栈连接的一个串行端口,能支持最多60个不同的连接(例如DOS中的COM1和COM2接口)。SDP可以作为客户机或者服务器工作。作为客户机时,它从另一个蓝牙节点获得有关的服务信息;作为服务器,它提供正在蓝牙设备上执行的服务的关键相关信息。

    组成功能模块

    在图2中有标为管理实体、安全管理器和事件管理器的其它模块,他们实现蓝牙设备控制操作所需的功能。管理实体向应用开发商提供接口,允许他们在覆盖范围内找到其它蓝牙节点,并与这些节点建立RF连接。

    安全管理器对希望通过建立连接来得到服务的其它设备进行认证。它还能起动一个加密模式以保护通过公共的RF链路传输和接收的数据。事件管理器是堆栈中的关键部分,它提供将堆栈集成到操作系统中所必需的所有接口,而这是实现任何解决方案的第一步(见图2)。

    如果忽略了某些防范措施,则有可能对堆栈操作(以及蓝牙认证委员会的强制性产品认证)产生不良的影响。堆栈再进入、存储器管理和外围集成软件有可能消耗处理器的大量时间,这是设计工程师亟待解决的问题。由于很多不同的开发商提供这方面的蓝牙方案,因此这些问题与所使用的协议堆栈软件有关。

    堆栈处理必须规范地进行,只有这样才能及时对输入数据作出响应,并发送本地应用所产生的数据。因为嵌入式硬件解决方案是唯一的,开发自己的硬件驱动器必须支持主控制器或无线硬件和主机或控制处理器之间的通讯。

    主机和主机控制器之间的接口使HCI成为保障不同协议和无线硬件组件之间的兼容所必须的。几家销售商提供的大多数无线硬件支持UART或者USB连接。传输控制器源代码通常是由协议销售商提供,可以让设计工程师在开发与无线的接口时无限制地使用。根据产品开发者使用的硬件平台不同,通常需要修改源代码。 0201B_DC3_F3-C.JPG

    应用程序开发

    图2表示出两种截然不同的应用模块:一个负责与其它蓝牙设备的连接管理。另一个则实际实现这一应用。本例子中的应用是LAN接入点,并包括PPP和与LAN连接的协议接口,图中没有表示出这部分。

    在开发中最为重要的一点是了解蓝牙系统如何使用协议组件来构造堆栈,并实现正常工作。使用应用程序之前,在设备之间建立连接有五个步骤:

    1. 查找(或查询)设备:确定邻近的其它蓝牙设备的地址,以及它们使用设备类别(CoD)信息的能力;

       

    2. 查找名称:也可选择通过连接查找到的节点并向其询问来确定该节点的正确名称;

       

    3. 查找服务:获取设备支持的应用程序信息,以及连接该应用程序所必须的信息;

       

    4. 安全保证:采用通行认证、授权处理以及在要求时进行加密处理来保证安全;

       

    5. 应用连接:使用服务查找得到的参数来调用应用程序。

    图1中的PDA首先必须通过反复发送“INQUIRY”包来发现其它蓝牙设备的存在。在10米服务区内的其他设备希望PDA发现自己,这些设备在此期间通过发送包含自己地址的响应信息来向其他设备表明自己的存在,在响应信息中包含所支持的服务种类和服务属性等信息。

    下一个步骤是可选的。如果在PDA的查找过程中发现的服务是可以接受的(在这个例子中是LAN访问),PDA可以确定远程设备的正确名称。实现的方法是通过连接到LAP,并询问名称,然后断开连接。PDA可以将该名称提交给用户,通过识别后就可以开始建立连接的过程。

    服务查找是PDA必须进行的下一步骤。通过向LAP发送请求来获得关于所提供的服务的进一步信息。提交给PDA的重要信息不仅包括所提供的服务,还有PDA建立与LAP的客户链路所必须采取的方式,该方式能动态改变。

    在这里,有两条信息值得关注:连接到RFCOMM模块层的串行端口号,以及LAN加载统计数。如果LAN处在重负荷工作状态,由于速度可能会很慢,PDA可能不会继续使用所提供的服务。

    由于蓝牙是一个公共网络,通常使用安全措施来防止对节点的未授权访问。有三种安全模式可供选用:无安全模式、应用安全模式和无线链路安全模式。采用无安全模式时,任何设备都允许访问LAP,但是规范不允许出现这种情况。采用LAP规定的无线链路安全模式,则在PDA等其它设备希望建立无线连接的时候调用安全处理程序。

    使用第二种安全模式时,在收到一个建立在L2CAP或RFCOMM层(见图3)上的对等连接请求后,LAN接入节点就开始认证过程(或匹配)。在本例子中,RFCOMM是作为调用LAP的安全措施的触发点。在触发后,LAP就使用建立RF连接时提供的PDA的唯一地址。LAP获得由用户输入或者存储在存储器里的个人识别码(PIN)。然后,LAP生成一个随机数,并将该数送给PDA。双方都使用PIN、PDA地址和随机数产生一个数字(链路密钥)。PDA将该数字送回给LAP,并与另一方生成的数字进行比较。如果匹配,PDA则通过了认证。

    图4为支持第二种安全模式的应用层情况。在进一步研究该实例之前,必须首先了解另外两个与安全有关的技术:授权与加密。授权是通过用户接口向用户询问是否允许连接的行为,如果得到肯定的回答,则允许连接;加密是在设备之间对发送和接收数据进行的,这样可以保证数据不被第三方截获。 0201B_DC3_F4-C.JPG

    建立RFCOMM连接的过程

    重新回到实现安全的LAP应用实例,该实例需要执行11个步骤。PDA通过发送一个建立L2CAP连接请求。建立连接后,再请求建立RFCOMM连接,安全管理器查询数据库,了解该请求的认证和授权信息。

    然后,安全管理器会检查设备数据库,查看该蓝牙设备是否曾经通过该服务的认证。如果该设备曾经通过认证,它应该有一个可以使用的链路密钥,则认证的过程可以是透明的-这些设备将被连接。假定PDA是一个新用户,安全管理器会指示主控制器开始认证。

    无线硬件从安全管理器请求到一个PIN,该PIN反过来调用连接管理应用程序,以便从用户(或者存储器)得到PIN号码。该PIN将被返回至安全管理器,再由安全管理器提供给主控制器。至此,认证过程成功完成(假定PDA使用相同的PIN号码)。

    该设备的信息被输入到设备数据库供将来参考。安全管理器然后开始认证过程:它首先向用户询问(或者查看存储器)是否允许PDA连接。如果允许,该信息将被存储在设备数据库中,并打开加密功能。然后就可以建立RFCOMM连接。

    现在,PPP会话可以如常进行,这在蓝牙协议V1.0B的LAN访问规范中有定义。现在可以启动并使用应用程序、访问LAN和后续服务器节点。

    应用程序初始化

    尽管链路管理可能很复杂,但对于一位具备了全局观念的通信设计工程师来说,不会太难。在管理任何无线连接之前,软件必须先通过执行一些特定任务来对嵌入式系统进行配置。

    首先,必须为连接到无线单元的硬件地址的产品指定一个名称(例如Hardware_Design)。还必须定义CoD参数(这可能由终端用户决定),以保证识别产品的唯一性。

    另外,软件还必须用一项或多项服务记录初始化SDP数据库,这些记录能表明产品支持的应用类型以及进一步描述应用特点的相关属性(例如,RFCOMM的第四个端口用来支持到LAN的连接)。

    作为该过程的一部分,软件必须用与安全模式相关的信息初始化服务数据库,这些信息是提供蓝牙服务的产品在服务接入时所要求的(见图4)。然后,所有应用程序必须以蓝牙堆栈注册,从而允许堆栈通知应用程序输入数据已准备就绪,可以进一步处理。

    如果在RFCOMM层的数据端口注册后,并可以接受远程应用的连接,或者可以对远程蓝牙设备的数据进行处理,则软件应该对无线硬件进行配置使之能不断地侦听区域内是否有其它蓝牙设备发送请求。

    很明显,LAN接入点构成一个服务器。它向其它蓝牙设备提供服务,并必须将服务准备成多种响应方式,以向远程蓝牙设备提供允许其使用服务的强制信息。

    使用蓝牙技术开发应用程序首先要求开发包括操作系统集成、硬件集成、RF连接管理和安全措施的支持软件。当这一工作完成后,工程师可以集中精力于如何成功设计和实现应用程序。

    成功地实现软件设计并不需要对无线操作或者蓝牙协议堆栈操作有深厚的知识基础,而了解系统是如何与其它设备之间运作才是关键。

    本文重点讨论了底层软件的开发,因为这些是希望快速实现解决方案的应用开发商经常提出的问题,而评判蓝牙设备成功的关键在于是否能与市场上其它设备进行互操作。

    展开全文
  • 蓝牙设计

    2015-09-22 14:04:03
    蓝牙设计   1. 问:什么是蓝牙通信? 答:蓝牙通讯最初设计初衷是方便移动电话(手机)与配件之间进行低成本、低功耗无线通信连接,现在已经成为IEEE802.15标准,得到全球上万家厂商支持。   2. 问:如果从事...

    蓝牙设计30问

     

    1.    问:什么是蓝牙通信?

    答:蓝牙通讯最初设计初衷是方便移动电话(手机)与配件之间进行低成本、低功耗无线通信连接,现在已经成为IEEE802.15标准,得到全球上万家厂商支持。

     

    2.    问:如果从事蓝牙开发有没有前途?

    答:严格地说,这不是一个技术问题,而是一个世界观问题。什么是前途?如果单纯是金钱,从事技术是不太可能暴富的(注意比尔.盖茨是个技术商人);如果想用你所能改善世界,这是可能的,毕竟蓝牙的主要用途是民用。附带说一句,考虑赚钱和改变世界是中国和西方人世界观的主要差别。

     

    3.    问:蓝牙有什么优势?

    答:首先是低功耗,以BLE 4.0为例,一节钮扣电池在静态工作状态可以支持一年;其次是低成本,TI公司的CC2540蓝牙SOC方案芯片出售价仅1美元,可以让人们低廉使用蓝牙技术;再次是开放性,2.4GHz的频段全球开放,没有政府监管;最后是适应时代潮流,现在是手机的时代,蓝牙技术本来就为它而生。

     

    4.    问:蓝牙4.0协议和BLE是什么?

    答:蓝牙4.0协议是20106月由SIGSpecial Interest Group)发布的最新标准,它有2种模式:BLEBluetooth low energy)只能与4.0协议设备通信,适应节能且仅收发少量数据的设备(如家用电子);BR/EDRBasic Rate / Enhanced Data Rate),向下兼容(能与3.0/2.1/2.0通信),适应收发数据较多的设备(如耳机)。

     

    5.    问:目前支持蓝牙4.0的移动设备有哪些?

    答:截止2013年有:苹果公司的iPhone 4SiPhone 5miniPadiPad 3;小米手机2;三星公司的Galaxy SIIINote IIHTC ONE系列。

     

    6.    问:如何开始蓝牙4.0的开发呢?

    答:概括地讲至少以下三方面的准备吧。硬件方面,需要购买TI公司蓝牙迷你套件,包括蓝牙USB电子狗和KeyFob以及CC Debugger传真器;软件方面,安装IAR for 8051TI公司BTool软件;技术知识,《CC2540/41 BLE Software Developer’s Guide 1.3》和《CC2540/41 User’s Guide》。

     

    7.    问:刚开始接触蓝牙如何快速上手?

    答:理论联系实践是比较好的学习方法,建议先学习《CC2540/41 BLE Software Developer’s Guide 1.3》,然后将SimpleBLEPerepheral工程导入IAR for 8051,结合电子狗和BTool,调试蓝牙通讯中的广播/连接/绑定/访问。光看书不动手,空虚;不看书光动手,浅薄。

     

    8.    问:IAR调试CC2540时程序导入到了芯片的Flash中了吗?

    答:确实。CC2540SOCSystem On Chip)芯片,它的内核就是8051,它需要从ROM中取指令,从RAM中取数据来运行。仿真时,CC Debugger会把程序导入芯片Flash中,再执行仿真。

     

    9.    问:当IAR调试中出现警告“缺少断点,无法运行到main()”?

    答:出现这个错误的原因是,IAR for 8051最多只能设置3个断点,如果设置过多,当程序下载后,将出现些调试警告。解决的方法很简单,去掉一些断点,再重新载入程序。

     

    10. 问:为什么IAR调试时有很多变量无法查看它的值?

    答:主要的原因是IAR编译器设置了优化功能,函数中的自动变量以及一些静态函数都被优化过了,所以没有生成对应的调试信息,无法查看和设置断点。解决的方法是关闭编译器的优化功能,右键点击工程的Options -> C/C++ Compiler -> Optimizations中的Level设置为None

     

    11. 问:蓝牙协议分层很多且比较复杂,该如何掌握呢?

    答:蓝牙协议从应用层到物理层一共分了8层,看上去比较复杂且API函数很多。首先不必要知道每一层的具体实现,掌握与应用紧密关联GAP/GATT(或者GAP RoleGATT Profiles)层就可以满足大部分设计需要;每一层的软件都是通过OSAL来调用的,因此需要了解OSAL的基本原理:任务/事件/消息/定时器/动态分配内存;最后把蓝牙通讯过程理解,将有助于开发。

     

    12. 问:OSAL是一个操作系统吗?

    答:OSALOperating System Abstraction Layer)操作系统抽象层,它不是一个真正的操作系统(它没有Context Switch上下文切换功能),但它巧妙地组织各任务,支持任务优先级,任务之间可以通过事件和消息来通信,为任务提供软定时器和动态内存分配。要避免的陷阱是,应用任务的单个函数运行时间不能太长(如操作大批量数据的Flash写),否则它无法及时调度高优先级的LLLink Layer)任务而导致蓝牙通信中断。

     

    13. 问:蓝牙节点是如何组成微微网的呢?

    答:蓝牙节点组网中,只能存在一个主节点(Central)和多个从节点(Peripheral),从节点是发出信号者,主节点是扫描且发起连接者。

     

    14. 问:主节点和从节点通信的过程是怎样的呢?

    答:当从节点发出广告信号(包括设备地址和设备名称之类的附加信息);主节点收到此广告信号后,向从节点发出扫描请求;当从节点回应扫描时,就完成了设备发现过程。

    接着主节点向从节点发出连接请求(包括连接时隙、从节点待机次数、连接超时值),从节点回应连接,就完成了建立连接。

    为了安全起见,一些数据的访问需要认证,它的完成是这样的:一方(可以是主节点,也可以是从节点)向另一方索要6位数字的密码,之后,两个节点彼此交换安全密钥用于加密和认证,此过程称为配对。

    认证的过程比较繁琐,BLE协议支持两节点保存认证的安全密钥(一般是非易失性存储器中),以便于两节点下次连接后快速认证,这就是绑定技术。

     

    15. 问:蓝牙通信中两个节点如何交换数据?

    答:这是蓝牙通信中最让初学者迷惑的地方。大部分通信,尤其是TCP/IP,交换数据的婚介是数据包,但蓝牙通信中,工程师找不到数据包访问方式,于是就产生疑问。其实蓝牙最底层也是基于无线数据包交换,只是通过层层封装,交付给工程师的API接口就变成了Client访问Server的方式。

     

    16. 问:ClientServer节点是如何定义呢?

    答:通俗地说吧,Server(服务器)就是数据中心,Client(客户端)就是访问数据者。特别说明,它与主/从设备是独立的概念:一个主设备既可以充当Server,又可以充当Client;从设备亦然。

     

    17. 问:Server是如何提供数据呢?

    答:Server首先将一个服务按“属性/句柄/数值/描述”这种格式予以组织,然后调用API函数GATTServApp_RegisterService将服务数据进行注册。举个实例吧,设提供一个电池电量服务字节,它允许Client读取,数据为一个8比特无符号数(0100%),它的组织如下:02 25 00 19 2A, 5个数据(小端格式)分别是:0x02=只读属性,0x0025=句柄;0x2A19=服务UUID

     

    18. 问:不明白Server提供服务中的UUID

    答:UUID(Universal Unique Identifier)全球惟一标识符,本来是SIC组织分配给特定蓝牙服务的标识,如分配0x2A25为设备序列号的UUID,这样任意蓝牙设备都可以通过它得到另一个设备的序列号。

    打个类比,它就像书名,如《现代操作系统》,所有人一看就知道它是计算机大师Andrew S. Tanenbaum写的书。

     

    19. 问:什么是Server提供服务中的句柄呢?

    答:句柄(Handle)就是服务数据在数据中心的地址,当所有的服务数据组织起来后,它总得有个先后顺序,某个服务的位置就是它的句柄。还是上面的类比,如果想去图书馆借阅《现代操作系统》,需要查明该书在哪一层楼,哪个房间,这就是该书的Handle

     

    20. 问:为什么Server提供的服务中有描述?

    答:有些服务是有描述(Descriptor)的,它是用于Client配置该服务的功能(通知或者显示)。像某人没有借到《现代操作系统》该书(可能是被别人借光了),他(她)可以打个电话给图书馆工作人员,请求一旦该书可以借阅了给他一个通知,这个过程相当于配置该书的Descriptor

     

    21. 问:服务的属性与描述有区别吗?

    答:有区别,服务的属性是Server设置访问权限。就像图书馆的工作人员可以设置《现代操作系统》仅能在阅览室看不能外借(只读),或者即可以看也可以外借(读/写)。

    22. 问:Client如何访问Server的服务呢?

    答:大致分三类:读取服务的值,需要知道服务的UUID或者Handle;写服务的值,需要知道服务的Hanle;写服务描述符,需要知道该DescriptorHanle

     

    23. 问:如何知道一个服务的Handle

    答:根据服务的UUID调用API函数GATT_ReadUsingCharUUID

    协议栈会返回该服务的Handle。特别注意的是,一个服务的DescriptorHandle总是该服务的Handle+1,如电池电量服务的Handle0x0025,那么它的DescriptorHandle0x0026

     

    24. 问:Server可以访问Client吗?

    答:蓝牙通信中,Server不能直接访问(读/写)Client,但是可以通知(NotificationClient,通知的前提是Client通过写Descriptor使能通知功能。例如,某Server发现电池电量已经低于安全阀值,它可以调用GATT_Notification通知所有已连接的Client,但是Client接收后如果处理是它自己的事情。

     

    25. 问:如果得知电池容量?

    答:任何使用电池供电的设备都必须精确监控电池容量,否则设备可以突然断电而停止工作,它的基本原理是通过ADC(模数转换器)计算电池电压。以CC2540芯片用一钮扣电池为例,电池电压从2.0v3.0v,即电量的0%100%CC2540有一10比特的ADC,量程范围为0511,参考电压为1.25v,最大测量电压为3.75v,以上信息可以得知:(v/3/ 1.25 * 511 = adc,则2.0v=273adc3.0v=409adc,根据下图可以很容易得知ADC转换为电压的公式:

    Percentage / (X – 273) = 100 / 136 = 25 / 34,变换后为:

    Percentage = (X - 273) * 25 / 34,为四舍五入提高计算精度则有:

    Percentage = [(X - 273) * 25 + 33] / 34

     

    26. 问:蓝牙发射信号功率调整会影响通信距离吗?

    答:会,以TI公司的CC2540为例,它支持4种发射功率选择:4dBm0dBm-6dBm-23dBm,按无线电功率定义:LdBm=10lg(Pwr/1mW),以上4种分贝值换算成瓦特为:2.51mW1mW0.251mW0.005mW,有效通信距离分别为:3010米、7米和3米。

     

    27. 问:如何知道两个蓝牙通信节点之间的距离?

    答:要知道蓝牙通信节点(如手机和蓝牙设备)之间的距离,最容易实现的方法是通过读取接收RSSIReceived Signal Strength

    Indication)值来计算。无线通讯中功率与距离的关系如下:

     其中A可以看作是信号传输1米远时接收信号的功率,n是传播因子(它受障碍,温度和湿度等影响),r是节点之间的距离。当确定了常数An的值后,距离r就可以根据PR(dBm)计算出来。

     

    28. 问:如何获取蓝牙节点的接收RSSI值?

    答:具体的设备接收RSSI值的方法不一样,以iPhone手机为例,iOS提供API函数获取RSSI值;TI公司的CC2540芯片的BLE协议栈中,首先将读取RSSI值回调函数挂载到gapRolesRssiRead_t类型的指针下,建立连接后,主设备调用GAPCentralRole_StartRssi(),从设备调用

    GAPRole_SetParameter(GAPROLE_RSSI_READ_RATE, ……)。这样就可以定时读取接收的RSSI值了。

     

    29. 问:如何开展读取RSSI值的实验?

    答:读取RSSI值的实验可以这样搭建,主设备固定位置,向从设备发送信号,从设备LED光和Buzzer报警为通信成功,逐次移动从设备,而获取RSSI值随物理距离之间的关系。下图是笔者做实验的数据:

    Distance(m)

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    RSSI(dBm)

    -47

    -59

    -73

    -80

    -80

    -79

    -85

    -88

    -86

    -87

    Loss(p)

    0

    0

    9

    11

    27

    2

    50

    32

    22

    49

    实验器材为2CC2540芯片,主芯片发射功率为4dBm(2.51mW)Loss是通信节点中失败次数。

     

    30. 问:如何将接收RSSI实验数据得到距离计算公式呢?

    答:最好的工具是EXCEL软件,以上表中的实验数据和EXCEL 2007为例。首先选中DistanceRSSI两行,点击“插入->散列图”,软件会自动生成如下图:

    选取其中任意点,点右键,“添加趋势线->对数”,将会出现下图:

    可见RSSI与距离的关系是比较符合指数函数,再点击“显示公式”

    此时得到指数函数公式为:y = -49.53 – 17.7 ln (x),再把自然对数换成10常用对数,则有:y = -49.53 – 40.71 lg (x)。通过以上几步就轻松得到RSSI与距离之间的计算公式。

     

    31问:针对RSSI采样值选用什么样的滤波算法?

    答:RSSI采样值遵循以下特点:有个别的脉冲干扰引起极大值和极小值的出现,其他采样数据值沿平均值分布,比较适合的算法是:滑动防脉冲干扰平均滤波法。它的原理是,设有N个单位的队列,用新的采样值覆盖旧的采样值,去除队列中最大值和最小值后,再计算队列中采样数据的平均值。用C语言描述如下:

    static INT8S Filter(INT8S chVal)

    {

        #define FIFO_NUM    10

     

        INT8S    chMinVal, chMaxVal, chTemp;

        INT16S    nCnt, nSum;  

     

        static INT8S    s_chIx = 0, s_chIsFull = FALSE;

        static INT8S    s_achBuf[FIFO_NUM];

     

        /* Save the NEW value, kick out the OLDest one */

        s_achBuf[s_chIx] = chVal;

        if (++s_chIx >= FIFO_NUM)

        {

            s_chIx = 0;    /* Wrap to 1th unit */

            s_chIsFull = TRUE;         

        }

     

        /* Number of sampled data less than N */

        if (!s_chIsFull)

        {

            nSum = 0;

            for (nCnt = 0; nCnt < s_chIx; ++nCnt)

            {

                nSum += s_achBuf[nCnt];

            }

         

            return (INT8S)(nSum / s_chIx);        

        }

     

        /* Get the SUM and Max. and Min. */

        chMaxVal = chMinVal = nSum = 0;   

        for (nCnt = 0; nCnt < FIFO_NUM; ++nCnt)

        {

            chTemp = s_achBuf[nCnt];

            nSum += chTemp;

     

            if (chTemp > chMaxVal)   

            {

                chMaxVal = chTemp;

            }

            else if (chTemp < chMinVal)

            {

                chMinVal = chTemp;

            }

        }

     

        /* Calculate the average */

        nSum -= (chMaxVal + chMinVal);   /* SUB Max. and Min. */

        nSum /= (FIFO_NUM - 2);    /* Get average */

     

        return (INT8S)nSum;

    }

      

    展开全文
  • 蓝牙(Bluetooth)是由东芝、爱立信、IBM、Intel和诺基亚于1998年5月共同提出的近距离无线数据通讯技术标准。它能够在10米 的半径范围内实现单点对多点的无线数据和声音传输,其数据传输带宽可达1Mbps。通讯介质为...

    蓝牙(Bluetooth)是由东芝、爱立信、IBM、Intel和诺基亚于1998年5月共同提出的近距离无线数据通讯技术标准。它能够在10米 的半径范围内实现单点对多点的无线数据和声音传输,其数据传输带宽可达1Mbps。通讯介质为频率在2.402GHz到2.480GHz之间的电磁波 [1]。
    蓝牙技术已获得了两千余家企业的响应,从而拥有了巨大的开发和生产能力。蓝牙已拥有了很高的知名度,广大消费者对这一技术很有兴趣。
    蓝牙技术可以方便地建立无线连接代替传统的有线电缆连接,本论文给出了一种基于蓝牙的无线数据传输系统的研制方案及软件关键算法,能够实现短距离内数据的无线传输,具有较强的可靠性和较快的数据传输速度,能够应用在各种不方便使用有线电缆的现场。
    本程序采用VisualC++软件设计平台完成了初始化蓝牙协议栈、查询蓝牙设备、建立ACL连接以及发送数据的全过程,实现了点对点及点对多点的蓝牙无 线数据传输。为了完成整个应用程序本论文采用了基于蓝牙协议栈的开发方案,并阐述了这一方案的设计过程,原理,方法以及测试过程。在本次设计过程中应用程 序通过对按钮事件的响应来完成对各种命令消息的处理,通过使用蓝牙协议栈提供的动态链接库中包含的函数完成了对蓝牙设备的各种操作,从而完成了本次毕业设 计。实验证明,本程序能够实现短距离内数据的无线传输,具有较强的可靠性和较快的数据传输速度。

    关键词 蓝牙,数据传输,动态链接库

    摘 要 I
    ABSTRACT II
    第一章 绪论 1
    1.1研究背景及意义 1
    1.1.1 研究背景 1
    1.1.2 蓝牙技术发展现状 2
    1.2研究的意义 3
    1.3研究的主要内容和基本思路 4
    1.4论文的构成 5
    第二章 蓝牙系统分析 7
    2.1蓝牙市场分析 7
    2.1.1蓝牙的应用产品分析 7
    2.1.2蓝牙的市场状况分析 8
    2.1.3蓝牙的市场前景分析 8
    2.2系统可行性分析 9
    第三章 系统的总体设计 10
    3.1蓝牙协议体系结构 10
    3.2蓝牙数据传输关键技术 11
    3.3系统开发方案设计 14
    3.3.1 基于完整协议栈的开发方案 14
    3.3.2基于开放协议栈的开发方案 14
    3.3.3 基于蓝牙硬件的开发方案 15
    3.3.4 蓝牙数据传输系统开发方案设计 15
    3.4系统开发环境 16
    3.4.1硬件开发环境蓝牙DDP3303 16
    3.4.2软件开发环境VisualC++6.0 17
    3.5系统工作流程 18
    第四章 蓝牙数据传输系统软件设计模块 21
    4.1 蓝牙数据传输系统软件模块设计 21
    4.1.1 系统主界面的结构设计 21
    4.1.2 使用DLL调用的程序设计 24
    4.2 蓝牙数据传输系统界面说明 32
    4.2.1 启动程序界面 32
    4.2.2 观察窗口 32
    4.2.3 菜单栏 33
    4.3 蓝牙数据传输系统执行步骤 34
    4.4 蓝牙数据传输系统测试 35
    第五章 总结 42
    5.1调试过程中遇到的困难及解决方法 42
    5.2 工作总结 42
    5.3收获与心得 43
    5.4设计展望 44
    致谢 45
    参考文献 46

    ABSTRACT
    Bluetooth is the wire less close quarter data communication technical norms suggesting that commonly by Toshiba,Ericsson,IBM,Intel and Nokia on May,1998.It is able to realize wirless multiple spot data and voice transmission within 10 meters of radius range.It’s person data transmission bandwidth may amount to 1 Mbps.The communication medium is that frequency is in th electromagnetic wave between 2.480 GHz and 2.402 GHz[1].
    Bluetooth technology has already gained more than 2,000 enterprise responding and owned gigantic exploitation and efficiency thereby.Bluetooth has already owned very high notability,the exten sive consumer has had interest in this technology very much.
    Bluetooth technique made wireless connections expediently in place of cable connection in short distance. In this paper , a wireless data transfer system based on bluetooth technique is presented , including the sticking point of soft algorithm. The equipment could realize wireless PC data transfer in short distance ,the results show its advantages and high data transfer rate.The wireless PC data transfer system could apply to all kinds of complicated circumstance that use cable connections discommodious.
    This program adopts software developing platform of VisualC++ to complete the whole process of initializing Bluetooth protocol stack, inquiring Bluetooth equipment ,establishing ACL linking ,sending datas and realizing data transfer of point to point and point to mult-point. This paper adopt the method which is based on BlueTooth protocol stack to realize whole application program. The designing course, principle, measure and testing process are expounded in this paper. In this design application program passess the treatment coming to be completed to various order information responding to button event ande use the function which is included in DLL(Dynamic Link Library) which is provided by BlueTooth protocol stack to have accomplished various to Bluetooth equipment. The application program could realize wireless PC data transfer in short distance,the results show its dependability and high data transfer rate.

    KEY WORDS bluetooth, data transfer, dll(dynamic link library)
    第一章 绪论
    1.1研究背景及意义
    1.1.1 研究背景
    蓝牙是一种支持设备短距离通信(一般是10m之内)的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。蓝牙的标准是IEEE802.15,工作在2.4GHz 频带,带宽为1Mb/s。
    “蓝牙”(Bluetooth)原是一位在10世纪统一丹麦的国王,他将当时的瑞典、芬兰与丹麦统一起来。用他的名字来命名这种新的技术标准,含有将四分 五裂的局面统一起来的意思。蓝牙技术使用高速跳频(FH,Frequency Hopping)和时分多址(TDMA,Time DivesionMuli-access)等先进技术,在近距离内最廉价地将几台数字化设备(各种移动设备、固定通信设备、计算机及其终端设备、各种数字 数据系统,如数字照相机、数字摄像机等,甚至各种家用电器、自动化设备)呈网状链接起来。蓝牙技术将是网络中各种外围设备接口的统一桥梁,它消除了设备之 间的连线,取而代之以无线连接。
    蓝牙是一种短距的无线通讯技术,电子装置彼此可以透过蓝牙而连接起来,省去了传统的电线。透过芯片上的无线接收器,配有蓝牙技术的电子产品能够在十公尺的 距离内彼此相通,传输速度可以达到每秒钟1兆字节。以往红外线接口的传输技术需要电子装置在视线之内的距离,而现在有了蓝牙技术,这样的麻烦也可以免除了 [2]。
    蓝牙技术是一种无线数据与语音通信的开放性全球规范,它以低成本的近距离无线连接为基础,为固定与移动设备通信环境建立一个特别连接。其程序写在一个9 x 9 mm的微芯片中。例如,如果把蓝牙技术引入到移动电话和膝上型电脑中,就可以去掉移动电话与膝上型电脑之间的令人讨厌的连接电缆而而通过无线使其建立通 信。打印机、PDA、桌上型电脑、传真机、键盘、游戏操纵杆以及所有其它的数字设备都可以成为蓝牙系统的一部分。除此之外,蓝牙无线技术还为已存在的数字 网络和外设提供通用接口以组建一个远离固定网络的个人特别连接设备群。
    蓝牙是一种低功耗的无线技术,其设计意图是取代现有的PC机、打印机、传真机、移动电话等设备上的有线接口。作为一种新技术,蓝牙的主要优点是:可以方便 地建立无线连接来代替传统的有线电缆连接;移植性较强,可以应用到很多通信场合中,如WAP、GSM、DECT等;安全性较高,且每一台蓝牙设备的地址全 球唯一;功耗低、设计开发方便、成本较低[3]。
    作为一种电缆替代技术,蓝牙具有低成本和高速率的特点,它可把内嵌有蓝牙芯片的计算机、手机和多种便携通信终端互联起来,为其提供语音和数字接入服务,实 现信息的自动交换和处理。蓝牙产品涉及PC、笔记本电脑、移动电话等信息设备和A/V设备、汽车电子、家用电器和工业设备领域。而一旦支持蓝牙的芯片变得 非常便宜,蓝牙将置身于几乎所有产品之中,从微波炉一直到衣服上的纽扣。
    蓝牙在个人局域网中获得了很大的成功,应用包括无绳电话,PDA与计算机的互联,笔记本电脑与手机的互联,以及无线RS232,RS485接口等。采用蓝 牙技术的设备使用方便,可自由移动。与无线局域网相比,蓝牙无线系统更小、更轻薄,成本及功耗更低,信号的抗干扰能力强[4]。
    1.1.2 蓝牙技术发展现状
    蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段。蓝牙的数据速率为1Mb/s。时分双工传输方案被用来实现全双工传输。ISM频带是对所有无线电系统都开放的频带,因 此使用其中的某个频段都会遇到不可预测的干扰源。例如某些家电、无绳电话、汽车房开门器、微波炉等等,都可能是干扰。为此,蓝牙特别设计了快速确认和跳频 方案以确保链路稳定。跳频技术是把频带分成若干个跳频信道(hop channel),在一次连接中,无线电收发器按一定的码序列(即一定的规律,技术上叫做”伪随机码”,就是”假”的随机码)不断地从一个信道”跳”到另 一个信道,只有收发双方是按这个规律进行通信的,而其他的干扰不可能按同样的规律进行干扰;跳频的瞬时带宽是很窄的,但通过扩展频谱技术使这个窄带宽成百 倍地扩展成宽频带,使干扰可能的影响变成很小。与其它工作在相同频段的系统相比,蓝牙跳频更快,数据包更短,这使蓝牙比其它系统都更稳定。FEC (Forward Error Correction,前向纠错)的使用抑制了长距离链路的随机噪音。应用了二进制调频(FM)技术的跳频收发器被用来抑制干扰和防止衰落。
    蓝牙基带协议是电路交换与分组交换的结合。在被保留的时隙中可以传输同步数据包,每个数据包以不同的频率发送。一个数据包名义上占用一个时隙,但实际上可 以被扩展到占用5个时隙。蓝牙可以支持异步数据信道、多达3个的同时进行的同步话音信道,还可以用一个信道同时传送异步数据和同步话音。每个话音信道支持 64kb/s同步话音链路。异步信道可以支持一端最大速率为721kb/s而另一端速率为57.6kb/s的不对称连接,也可以支持43.2kb/s的对 称连接。
    通过蓝牙技术连接在一起的设备组成微网。蓝牙技术的无线电收发器的链接距离可达30英尺,不限制在直线范围内,甚至设备不在同一房间内也能相互链接,并且 可以链接多个设备,这就可以把用户身边的设备都链接起来,形成一个”个人领域的网络”(Personal area network)。虽然微网的节点数有限,但多个微网可以连接在一起,组成一个无限大的散布网,从而将不同设备,如个人电脑、拨号网络、笔记本电脑、打印 机、传真机、数码相机、移动电话、高品质耳机等几乎所有具有开关功能的设备,通过无线的方式连成一个围绕个人的网络,使各种数字设备实现真正的资源共享。 蓝牙技术的最终目的是要建立一个全球统一的无线连接标准,让不同厂家生产的移动计算设备在近距离内无需电缆线就可实现数据共享。
    爱立信在1999年的Comdex展会上推出了世界上第一款蓝牙耳机 HBH-10,随后又在2001年推出了世界上第一款蓝牙手机T36。现在,由爱立信与索尼公司合并手机业务部门后成立的索尼爱立信,以及诺基亚在它们的 新款手机中几乎全部内置了蓝牙功能。另外,摩托罗拉和三星两大手机厂商则主要在高端手机上集成蓝牙功能。国产手机厂商中联想、CECT、夏新等均开始对蓝 牙技术表现出了热情。2002年第三季度微软宣布其Windows XP操作系统支持蓝牙。另外,Windows Pocket PC、Windows CE、苹果电脑的Mac OS X操作系统、Palm和多数手机操作系统都已经增加了对蓝牙的支持。同时,全球各地还有诸多科技公司正在生产各种蓝牙耳机、蓝牙网关、蓝牙USB接口适配 器等小型产品。
    近年来,蓝牙技术的发展转折点主要有两个:一个是1.2版本让无限局域网(WLAN)能与蓝牙共存,另一个则是新版蓝牙传输协议增强数据速率(Enhanced Data Rate,EDR),它将蓝牙的传输速率提高到了2Mb/s。
    目前,蓝牙技术开发重点是多点连接,即一台设备同时与多台(最多7台)其他设备互联。而蓝牙技术的应用主要有以下3类:
    (1)语音/数据接入:是指将一台计算机通过安全的无线链路连接到通信设备上,完成与广域网的联接。
    (2)外围设备互连:是指将各种设备通过蓝牙链路连接到主机上。
    (3)个人局域网(PAN):主要用于个人网络与信息的共享与交换[5]。
    1.2研究的意义
    蓝牙规范接口可以直接集成嵌入到普通电脑、笔记本电脑或一体机电脑的内部芯片中,或通过PC卡或USB接口连接。因而,蓝牙技术在实际生活中的应用十分广 泛。蓝牙耳机、蓝牙键盘、蓝牙数码相机等应用随处可见。在人民生活水平不断提高,通信电子高速发展的今天,更加实用的蓝牙设备及其短距离网络已逐步地进入 我们生活和工作中。
    近年来,移动通信发展迅速,便携式计算机如膝上型电脑(Laptop)、笔记本电脑(Notebook)、手持式电脑(HPC)以及个人数字辅助器 (PDA)等也迅速发展,还有因特网的迅速发展,使人们对电话通信以外的各种数据信息传递的需求日益增长。蓝牙技术把各种便携式电脑与蜂窝移动电话用无线 电链路连接起来,使计算机与通信技术更加密切的结合起来,使人们能随时随地进行数据信息的交换与输。因此,计算机行业、移动通信行业都对蓝牙技术非常重 视,认为蓝牙技术将对未来的无线移动数据通信业务产生巨大的促进作用。预计在最近几年内,蓝牙技术、蓝牙芯片、蓝牙产品都将获得重大进展。因此,推广研究 和普及应用蓝牙短距离网络技术,将对信息产业的更快速而统一的发展,提高商务经管领域中信息交流的便捷高效,便利人民生活有着直接而现实的意义。
    由于用蓝牙技术可以组成个人局域网,它还能应用到其他许多方面。例如瑞典律勒欧科技大学EIS实验室就开发出无线个人局域网,对曲棍球运动员进行实时检测,培养曲棍球运动员。
    蓝牙技术还可以用在遥控汽车上。SigmaComtech介绍了一种用具有蓝牙功能的操作杆来无线控制汽车,输入指令从操纵杆传送到计算机,由其产生控制信号发送给汽车。这一平台还可以在工业应用中使用。
    蓝牙的市场是广阔的,前景是光明的。有人预测,到2005年将有14亿个蓝牙产品,价格也会大幅度下降。那时的最大市场是数字移动电话、计算机和外围设备、PC卡、适配器和耳机。大量普及阶段将在2006年,到2010年后蓝牙产品就会无处不在。
    由于市场需求,越来越多的蓝牙硅片即将投入生产。旅馆、邮局、高尔夫球场、飞机场、零售商场、会议中心和商业领域都在采用蓝牙技术。BluetoothSiG现已拥有2400家会员公司,预计2005年蓝牙芯片将达14亿片,应用机器近7亿台。
    蓝牙的市场前景取决于蓝牙价格和基于蓝牙的应用能否达到一定的规模。目前,蓝牙设备一般由23个芯片组成,价格已低达8美元/片,并逐步向5美元/片迈进。业内人士分析,随着芯片价格、芯片大小以及可操作性、兼容性等问题的进一步解决,蓝牙市场前景必定会更好[6]。
    1.3研究的主要内容和基本思路
    本次毕业设计中我使用了蓝牙演示开发平台(DDP,Bluetooth Demonstration and Development Platform),其基本核心协议(BCP)组件包括硬件电路模块和软件部分,其中软件部分以应用程序扩展的方式提供动态链接库(DLL),需要运行在 操作系统为Windows2000的计算机上。BCP_DLL是蓝牙高层应用程序开发的组件,可以用于开发蓝牙应用。本组件具有以下特点:
     提供基于蓝牙上层点对点的完整的硬件、软件平台和解决方案,包括基带、射频、HCI接口功能以及核心协议;
     支持某一时刻点对点的语音和一点对多达七点的数据传输;
     提供基带射频硬件电路与计算机RS-232和USB的连接方式;
     软件部分运行于Windows2000操作系统上,简单易用;
     适于蓝牙较高层次的应用程序开发(提供动态链接库及其接口,以及开发的用户手册)。
    使用DDP的BCP组件可以进行蓝牙高层应用程序开发,实现查询附近设备、服务发现、语音和数据传输等功能。
    DDP的BCP组件包含蓝牙的一些基本核心协议,它们是:
     逻辑链路控制及适配协议(L2CAP)
     服务发现协议(SDP)
     串口仿真协议(RFCOMM)
    此外还包括用于处理和管理链路的管理实体(ME)。
    设计的重点是在蓝牙核心协议的理解和应用上,其次还要了解数据传输的有关内容。数据传输的一个重要内容是对要传输的数据进行分组。被拆分的数据还要根据蓝 牙数据包格式的定义,加上数据包头,以便模块对其进行正确的识别和处理。软件的主要功能是数据包分组的拆分和重组,所要发送的数据进行蓝牙格式处理后再组 合成较大的数据块,该例程已被写入动态链接库(BCP_DLL.dl1)中,由界面应用程序调用。
    根据系统设计的要求,在VisualC++的软件开发平台上,编制程序界面,完成系统的初始化、点对点的连接及断开、ACL数据的传输。要求界面简洁美观,便于操作,最后还要对此界面作简单的测试。
    1.4论文的构成
    本论文第一章论述了蓝牙的研究背景和发展现状,接着介绍了本论文研究的意义,以及研究的主要内容和基本思路,简要地描述了论文的总体结构和思路。
    第二章主要对蓝牙系统作了简要的分析,分别从蓝牙的应用产品,市场状况和市场前景这三个方面,之后又对蓝牙系统的可行性作了分析。只用通过提供蓝牙产品性能方面的各种数据才能体现出本次毕业设计中对蓝牙传输系统研究的现实意义。
    第三章首先介绍了蓝牙协议体系结构和蓝牙数据传输的关键技术,接着介绍了蓝牙产品开发的三种方案。通过比较,最后确定本设计的蓝牙数据传输系统开发方案。 最后介绍了本设计的硬件和软件开发环境以及系统的工作流程。硬件采用的是南京东大移动互联有限公司提供的蓝牙模块DDP3303,软件则是采用目前比较流 行的VisualC++6.0。
    第四章是论文的主体部分,主要介绍了在软件开发过程中对整个应用程序划分的各个模块的性能研究,以及各个模块中所使用到的VC6.0提供的控件和它的相应函数。此外还介绍了整个应用程序的执行流程,以方便用户使用。
    第五章主要是对本次毕业设计过程中的总结。对设计过程中所碰到的一些问题的说明和解决办法,还有个人的一些心得体会。

    第二章 蓝牙系统分析
    现代通信技术正走向网络核心技术分组化、窄带接入技术无线化。在无线接入领域,早期采用的是电路型传输方式和分组传输技术。近年来由Ericsson、 Intel、Nokia、Toshiba、IBM五家公司组成的蓝牙特殊利益集团SIG联手推出了蓝牙计划(Bluetooth)。采用蓝牙技术的设备使 用方便,可自由移动。与无线局域网相比,蓝牙无线系统更小、更轻薄,成本及功耗更低,信号的抗干扰能力强。本文正是研究基于蓝牙开发平台的无线数据传输, 并且非常具有实际应用价值,可广泛应用在实验及办公环境当中。
    2.1蓝牙市场分析
    蓝牙技术解决了短距离内(10~100米)小型移动设备间的无线互连问题。它的硬件市场非常广阔,涵盖了局域网络中的各类数据和语音设备等。蓝牙技术主要 针对三大类的应用:话音/数据接入、外围设备互连和个人局域网。从市场的角度看,蓝牙技术可制造出点对点连接、点对多点连接的市场应用产品及个人局域网等 网络设备。蓝牙正逐渐渗透到我们生活的各个方面,下面就从蓝牙的应用产品、市场状况和应用前景三个方面对其作简单的分析。
    2.1.1蓝牙的应用产品分析
    蓝牙产品根据不同的应用,可以大致分为四类[7],类与类之间存在着重叠。第一类是应用于各种适配器,如PCMCIA、USB蓝牙适配器、CF卡蓝牙适配 器等,这些适配器能够给己有的固定设备,如电脑和打印机等,实现无线连接的功能;第二类是蓝牙电气产品,如蓝牙耳机、电脑和其外围设备的连接(无线键盘、 无线鼠标、无线游戏操纵杆);第三类是嵌入式系统,这里的系统指电脑或其他固定设备,蓝牙设备直接集成在这些设备里,对于PC而言,可以将蓝牙系统直接集 成在主板上。嵌入到系统中后,就不必采用第一类的蓝牙适配器;第四类是移动电话,通过适配器或直接嵌入等方式将蓝牙功能集成到移动电话中。
    蓝牙应用确实非常广泛,而随着蓝牙技术的进一步成熟,蓝牙互操作性等问题的解决,蓝牙芯片成本的进一步降低,蓝牙产品必将大规模的投入生产和应用,为人类生活带来更多便利。
    2.1.2蓝牙的市场状况分析
    短距离无线蓝牙技术已经嵌入到了许多消费装置中,从笔记本电脑、手机到汽车都可以看到蓝牙的踪影。同时蓝牙在操作系统方面也得到了强有力的支持,2002 年第三季度微软宣布在Windows XP支持蓝牙,而在此之前已经有Pocket PC、Windows CE.Net、苹果电脑的Mac OS X操作系统、Palm与多数手机操作系统增加了对蓝牙的支持[8]。
    具权威机构预测,到2004年,在所有重要的电子产品中,60%将是便携式的,而蓝牙技术恰恰是为这些设备之间提供无线连接的主要技术。未来的信息家电将 是以因特网和家庭网络为基础,能以无线连接实现双向传输,显然蓝牙技术是符合家电需求的优选技术。据市场调查机构Navian公司日前公布的调查报告, 2001年全球蓝牙芯片发货量达505万套,价值9400多万美元。该公司认为,2002年全球蓝牙芯片发货量将超过3000万套,价值4.32亿美元。 另据美国ABI市场调查公司预测,采用蓝牙技术的通信应用设备将从2002年的5600万部迅速增长到2005年的超过10亿部。随着设备的增加,届时蓝 牙设备的销售额可达53亿美元。
    蓝牙技术不仅在手机、照相机及PC应用中显示出巨大的增长,而且汽车也将装备蓝牙技术设备。另据Frost&Sallivan公司研究,欧洲蓝牙芯片市场前景看好,2000年欧洲的销售额已达3670万美元,到2006年将达到约7亿美元[9]。
    2.1.3蓝牙的市场前景分析
    蓝牙的市场前景取决于蓝牙价格和基于蓝牙的应用能否达到一定的规模[10]。根据蓝牙的定位,蓝牙应该通过一个体积小、成本低、功耗低、跳速快的单芯片来 实现,只有低廉的价格才能在现有的通信产品、家电产品和办公产品中引入蓝牙技术。虽然目前定义了不少蓝牙的应用,但这些都是对传统应用的改进,真正基于蓝 牙的特性的应用还是很少,这也将成为影响蓝牙市场发展的重要因素。不过,即使蓝牙市场没有像预测的那样快速扩展,蓝牙的市场价值也不用怀疑,毕竟需求才是 影响市场的主要因素。
    目前,蓝牙的初期产品已经问世,一些芯片厂商已经开始着手改进具有蓝牙功能的芯片。与此同时,一些颇具实力的软件公司或者推出自已的协议栈软件,或者与芯 片厂商合作推出蓝牙技术实现的具体方案。尽管如此,蓝牙技术要真正普及开来还需要解决以下几个问题:首先要降低成本;其次要实现方便、实用,并真正给人们 带来实惠和好处;第三要安全、稳定、可靠地进行工作;第四要尽快出台一个有权威的国际标准。一旦上述问题被解决,蓝牙将迅速改变人们的生活与工作方式,并 大大提高人们的生活质量[11]。
    2.2系统可行性分析
    蓝牙系统采用ISM免费频段,在通信的时候无须考虑通信成本的问题。蓝牙设备的收发距离为l0米,作为室内的无线数据传输已足够,而增加发送功率传输距离 还可以达到100米。距离较短是蓝牙技术的一个缺点,但利用蓝牙技术组建的无线个人区域网可以有效解决这方面的不足。蓝牙设备可以每8个(也可以少于8 个)设备组成一个微微网,每个微微网又可以和其他的微微网互联组成散射网,从而提高蓝牙设备的通信距离,因此本系统可以很方便的进行扩展,实现远距离的无 线数据传输。并且还可以由点对点的传输,扩展到点对多点,由数据传输还可以扩展到语音传输,而且可以达到实时传输。蓝牙采用无线接口来代替有线电缆连接, 具有很强的移植性,适用于多种场合,加上该技术功耗低、对人体危害小,应用简单、容易实现,所以也易于推广。
    第三章 系统的总体设计
    要进行系统的设计,则必须详细了解所使用的硬件和软件开发环境,而要了解硬件开发环境,首先还必须了解蓝牙的协议体系结构以及蓝牙数据传输的一些关键技术。最后也是最重要的还必须了解蓝牙数据传输系统的工作流程。本章就是从以下几个方面分别进行阐述的。
    3.1蓝牙协议体系结构
    蓝牙核心系统覆盖了最低四层(射频层、基带层、链路管理层和逻辑链路控制与适配层L2CAP)和与其相关的服务层协议[12]。核心系统架构如图3.1所 示。最底三层有时作为一个子系统蓝牙控制器。通常在蓝牙控制器和L2CAP及其它应用层(即蓝牙主机)之间是一个标准的物理通信界面,而该物理通信界面一 般是可选的。该界面叫作主机控制界面(HCI),HCI层以下的叫做主控制器,HCI层以上的叫主机。蓝牙核心系统通过各种接入点来提供设备管理服务、传 输控制服务和数据传输服务(图中的椭圆形即为接入点)。下面对核心系统最低四层加以简单说明。
    (1)射频层:射频块主要在物理信道上可靠地传送和接收符合要求的数据。蓝牙的射频系统是一个跳频系统,其任一分组在指定时隙、指定频率上发送。它使用查 询和分页进程同步不同设备间的发送频率和时钟,为基带数据分组提供了两种物理连接方式,即面向连接(SCO)和无连接(ACL),而且,在同一射频上可实 现多路数据传送。
    (2)基带层:对射频块的时间和频率进行控制,传输符合基带要求的数据流。还-可使用各种用户模式在蓝牙设备间传送话音,面向连接的话音分组只需经过基带传输,而不到达L2CAP。话音模式在蓝牙系统内相对简单,只需开通话音连接就可传送话音。
    (3)链路管理器层:链路管理器主要对与物理信道、逻辑传输和逻辑连接上所传输的相关数据载荷进行编码和解码。它通过连接的发起、交换、核实,进行身份认证和加密,通过协商确定基带数据分组大小。它还控制无线设备的电源模式和工作周期,以及微微网内设备单元的连接状态。
    (4)逻辑链路控制与适配层(L2CAP):逻辑链路控制和适配层主要是进行流量控制和接收缓冲分配。L2CAP向上层提供面向连接的和无连接的数据服务,它采用了多路技术、分割和重组技术、群提取技术。L2CAP允许高层协议以64k字节长度收发数据分组。
    图3.1 蓝牙核心体系架构
    3.2蓝牙数据传输关键技术
    蓝牙系统一般由天线单元,链路控制(固件)单元,链路管理(软件)单元,蓝牙软件(协议)单元等4个功能单元组成(如图3.2)。蓝牙天线属于微带天线, 无线接口遵循FCC(美国联邦通讯委员会)对ISM (工业、科学、医学)频段的规定。基带描述了设备的数字信号处理部分,即蓝牙链路控制器,它完成基带协议和其它底层的链路规程。链路管理(LM)软件模块 携带了链路的数据设置、鉴权、链路硬件配置和其它一些协议。
    图3.2 蓝牙系统的组成

    蓝牙数据传输系统的主要技术包括:
    1. 射频特性
    蓝牙设备的工作频段选在全世界范围内都可自由使用的2.4GHz的ISM频段,频道采用23个或79个,频道间隔为1MHz,采用时分双工方式。蓝牙的无 线发射机采用FM调制方式,从而能降低设备的复杂性,最大发射功率分为3个等级100mW(20dBm),2.5mW(4dBm),1mW(0dBm), 在4-20dBm范围内要求采用功率控制。
    2. 跳频技术
    跳频是蓝牙使用的关键技术之一。对应单时隙包,蓝牙的跳频速率为1600跳/s;对于多时隙包,跳频速率有所降低,但是在建链时则提高为3200跳/s。
    3. TDMA结构
    蓝牙的基带符号速率为1Mb/s,采用数据包的形式按时隙传送,每时隙625µs,蓝牙系统支持实时的同步定向联接和非实时的异步不定向联接。蓝牙技术支持一个异步数据通道,3个并发的同步语音通道或一个同时传送异步数据和同步语音通道。
    4. 网络技术
    蓝牙技术支持点对点和点对多点连接。几个piconet可以被连接在一起,靠调频顺序识别每个,同一piconet所有用户都与这个跳频顺序同步。其拓扑 结构可以被描述为”多piconet”结构。在一个”多piconet”结构中,在带有l0个全负载的独立的pieonet的情况下,全双工数据速率超过 6Mbit/s。
    5. 基带
    基带部分描述了硬件-基带链路控制的数字信号处理规范。基带链路控制负责处理基带协议和其它一些低层常规协议。蓝牙基带协议是电路交换与分组交换的结合。 在被保留的时隙中可以传输同步数据包,每个数据包以不同的频率发送。一个数据包名义上占用一个时隙,但实际上可以被扩展到占用5个时隙。蓝牙可以支持异步 话音。每个话音信道支持64kbit/s同步话音链路。异步信道可以支持一端最大速率为721 kbit/s,而另一端速率为57.6kbit/s的不对称连接,也可以支持43.2kbit/s的对称连接。
    6. 连接类型和数据包类型
    连接类型定义了哪种类型的数据包能在特别连接中使用。蓝牙基带技术支持两种连接类型,即同步定向连接(SCO)类型(主要用于传送话音)和异步无连接 (ACL)类型(主要用于传送数据包)。同一个piconet中不同的主从对可以使用不同的连接类型,而且在一个阶段内可以任意改变连接类型。每个连接类 型最多可以
    支持l6种不同类型的数据包,其中包括四个控制分组,这一点对SCO和ACL来说都是相同的。两种连接类型都使用TDD(时分双工传输方案)实现全双工传 输。SCO连接为对称连接,利用保留时隙传送数据包。连接建立后,master和slave可以不被选中就发送SCO数据包。SCO数据包既可以传送话 音,也可以传送数据,但在传送数据时,只用于重发被损坏的那部分的数据。ACL链路就是定向发送数据包,它既支持对称连接,也支持不对称连接。 Master负责控制链路带宽,并决定piconel中的每个slave可以占用多少带宽和连接的对称性。Slave只有被选中才能传送数据。ACL链路 也支持接收master发给piconet中所有slave的广播消息。
    7. 纠错
    基带控制器有3种纠错方案:即1/3比例前向纠错(FEC)码、2/3比例前向纠错码和数据的自动请求重发方案。FEC(前向纠错)方案的目的是为了减少 数据重发的次数,降低数据传输负载。但是,要实现数据的无差错传输,FEC就必然要生成一些不必要的开销比特而降低数据的传送效率。这是因为,数据包对于 是否使
    用FEC是弹性定义的。报头总有占1/3比例的FEC码起保护作用,其中包含了有用的链路信息。
    8. 链路管理
    链路管理(LM)软件模块携带了链路的数据设置、鉴权、链路硬件配置和其它一些协议。LM能够发现其它LM远端并通过LMP(链路管理协议)与之通信。 LM模块提供的服务包括:①发送和接收数据。②请求名称。LM能够有效地查询和报告名称或长度最大可达l6位的设备ID。③链路地址查询。④建立连接。⑤ 鉴权。⑥链路模式协商和建立,比如数据模式或者话音/数据模式。在连接建立过程中模式是可以变更的。⑦决定帧的类型。⑧将设备设为sniff模式。工作在 sniff模式的设备只接收M时隙的数据。M时隙的位置是LM协商决定的。Master只能有规律地在特定的时隙发送数据。⑨将设备设为hold模式。工 作在hold模式的设备为了节能,在一个较长的周期内停止接收数据,平均每4s激活一次链路,这由LM定义,LC(链路控制器)具体操作。⑩当设备不需传 送或接收数据但仍需保持同步时将设备设为暂停模式。处于暂停模式的设备周期性地激活并跟踪同步,并检查page消息。
    9. 话音技术
    蓝牙话音信道采用连接可变斜率增量调制(CVSD)话音编码方案,并且从不重发话音数据包。CVSB编码擅长处理丢失和被损坏的语音采样,即使比特错误率达4% ,CVSD编码的语音还是可听的。
    10. 软件结构
    蓝牙设备需要支持一些基本互操作特性要求。对某些设备,这种要求涉及到无线模块、空中协议以及应用层协议和对象资格式。但对另外一些设备,比如耳机这种要 求就简单得多。蓝牙设备必须能够彼此识别并装载与之相应的软件以支持设备更高层次的性能。蓝牙对不同级别的设备(如PC、手持机、移动电话、耳机等)有不 同的要求,例如,无法期望一个蓝牙耳机提供地址簿,但是移动电话、手持机、笔记本电脑就需要有更多的功能特性。软件结构需要具有的功能包括:设置及故障诊 断工具、能自动识别其它设备、取代电缆连接、与外设通信、音频通信与呼叫控制、商用卡的交易与号簿网络协议等。蓝牙的软件(协议)单元是一个独立的操作系 统,不与任何操作系统捆绑。适用于几种不同商用操作系统的蓝牙规范正在完善中[13]。
    3.3系统开发方案设计
    蓝牙产品的开发主要有三种方案[14]:基于完整协议栈的开发方案,基于开放协议栈的开发方案和基于蓝牙硬件的开发方案。
    3.3.1 基于完整协议栈的开发方案
    目前蓝牙产品大多数采用的是基于协议栈的开发方案。这种方案使用完整的蓝牙协议栈和软硬件开发包,开发者不需要深入研究蓝牙协议规范,利用所提供的开发包 就可以在蓝牙协议栈基础上开发相应的蓝牙产品。采用这种方案的好处是蓝牙产品的开发具有常规性,难度小,从而研发周期短,但是完整的蓝牙协议栈和软硬件开 发包的价格比较贵,因此这种方案非常适合开发商用的蓝牙产品。
    3.3.2基于开放协议栈的开发方案
    随着蓝牙技术被越来越多地了解和研究,目前,在Internet上出现了一些基于linux操作系统的开放蓝牙协议栈。由于这种蓝牙协议栈具有的开放共享 性,因此用它来开发蓝牙产品最大的好处是开发成本低,但是因为没有开发包,仅仅在蓝牙协议栈的基础上,这会给蓝牙产品的开发带来一定的困难。另外, Internet上公布的这些开放的蓝牙协议栈,基本上是一些蓝牙爱好者共同开发的,往往没有经过全面的系统测试,从而导致整个协议栈的可靠性不高,这会 对所开发的蓝牙产品产生一定的影响。
    目前,在Internet上流传较为广泛的开放蓝牙协议栈主要包括IBM公司BlueDrekar蓝牙协议栈、Bluez蓝牙协议栈、Nokia的Affix蓝牙协议栈以及Axis的OpenBT协议栈。
    3.3.3 基于蓝牙硬件的开发方案
    在没有完整的蓝牙协议栈的情况下,也可以在蓝牙硬件的基础上进行开发。使用这一方案,一般有两种方式可以选择:一种是采用只提供无线接口的简单蓝牙硬件模 块,再针对应用自行开发主芯片,该芯片包括从基带层到应用层的完整蓝牙协议栈,这种开发方式较为复杂;另一种方法是购买由供应商提供的完整蓝牙模块,这种 蓝牙模块一般包括了无线收发层、基带层、链路管理层和主控制器层,再针对该蓝牙模块进行应用开发。在第二种开发方式中,由于主机和主机控制器层在硬件上完 全分离,所以需要通过HCI层把蓝牙模块和蓝牙主机连接在一起,为应用提供支持。
    3.3.4 蓝牙数据传输系统开发方案设计
    使用完整的蓝牙协议栈和开发包来进行蓝牙产品的开发,虽然其价格昂贵,但是开发周期短,开发难度小。因此针对本毕业设计题目,要求在较短的时间内,开展对蓝牙应用软件和产品的开发和研究是非常适用的。所以本课题采用了第一种开发方案,即基于蓝牙协议栈的开发方案。
    本设计是采用东南大学移动互联技术有限公司,提供的蓝牙开发平台(DDP 3303蓝牙芯片),实现无线数据的传输。此公司提供的蓝牙演示开发平台(DDP,Bluetooth Demonstration and Development Platform)基本核心协议(BCP)组件包括硬件电路模块和软件部分,其中软件部分以应用程序扩展的方式提供动态链接库(DLL),BCP_DLL 是蓝牙高层应用程序开发的组件,可以用于用户开发蓝牙应用。
    数据传输系统要求利用蓝牙开发平台所提供的软硬件,实现点到点的无线数据传输。本设计要求完成无线数据传输系统中发送端的程序设计与调试。采用VisualC++的程序设计开发环境,要求使操作界面简洁美观,达到点对点及点对多点的实时数据传输。
    3.4系统开发环境
    3.4.1硬件开发环境蓝牙DDP3303
    本设计采用南京东大移动互联技术有限公司提供的蓝牙模块,其型号是DDP3303,该平台可以提供RS232、USB接口供用户进行开发、调试使用,音频接口可进行蓝牙语音的传输。它的硬件电路模块有如下特点:
    ● 可动态设置主机与蓝牙主控制器之间的接口,方便主机与蓝牙之间进行动态协商。
    ● 支持完整的蓝牙演示功能,其中包括数据通信、语音通信和文件传输等,并且提供可靠的差错控制、重传等。
    ● 提供1.1B版本的蓝牙规范所有指令的测试接口,可方便地进行基于HCI层的指令测试。
    ● 记录窗口提供了工作流程和数据传输记录,以及上次工作流程的保存等功能,方便用户的学习和测试 。
    ● 可进行点对多点测试 。
    ● 充分了解掌握蓝牙协议栈包括l2cap、SDP、RFCOMM协议。
    ● 提供基于协议栈的应用模拟,包括蓝牙耳机、音频网关、模拟串口。
    ● 提供丰富的帮助文档,大大地加快了用户学习进度和效率。
    下面将列出DDP3303蓝牙开发平台主要技术参数表(表3.4.1),有了这些参数,我们就可以在此参数的约束下,达到最佳的传输效率。
    表3.4.1 主要技术参数表
    蓝牙规范版本 v1.2
    外型尺寸(长mm*宽mm*高mm) 75mm*45mm*20mm
    输入电压(v) 6V
    输入电流(mA) 40-50mA
    链接功耗(mw) Master:120mw;Slave:90mw
    睡眠功耗(mw) 1.5mw(可再唤醒)
    发射功率(mw) 1mw-10mw
    接收灵敏度(dbm) -75dbm
    工作温度 -40℃-50℃
    有效传输距离(M) 0m-15m
    工作方式 主从(可互换),从设备最多7个
    传输速率 732kb/s
    接口类型 USB/RS232
    运行环境 Win98/Win2000/WinXP
    工作频段 2.4GHz
    功能 数据/语音
    数据链接方式 SCO/ACL

    下图给出了本设计所使用的蓝牙DDP3303开发平台的外观图(图3.4.1),
    图3.4.1 蓝牙DDP3303开发平台的外观图
    3.4.2软件开发环境VisualC++6.0
    Visual C++ 6.0是一个基于Windows平台并为Windows平台开发应用程序的比较复杂的C++集成开发环境,是一个由许多部件组成的完整的开发环境。这些部 件协同工作,从而大大简化了软件开发的过程。在用Visual C++开发面向对象应用程序时,主要有两种方法:一种是使用Windows提供的API函数,另一种方法是直接使用Microsoft提供的MFC类库。 API是应用程序编程接口的缩写。API为应用程序提供系统的各种特殊函数及数据结构定义,Windows应用程序可以利用上千个标准API函数调用系统 功能。MFC类库集成了大量已经预先定义好的类。用户可以根据编程的需要调用相应的类,或根据需要自定义有关的类。本次毕业设计我使用VC++6.0 MFC类库来开发应用程序,开发效率高,并且便于理解[15]。
    3.5系统工作流程
    蓝牙数据传输主要完成系统的初始化、点对点的连接及断开、ACL数据的传输[14]。整个工作流程从模块的初始化开始逐步展开,其设计流程如图3.5所示。

    图3.5 工作流程图
    以下为每个部分的详细说明。
    (1)系统初始化
    系统初始化包括模块的初始化和系统初始状态设定。系统物理连接完成后,驱动程序自动加载,并开始初始化工作。系统首先将复位。驱动程序向模块发出 HCI_Rest指令,对模块进行复位,模块接收到该指令后,完成复位操作并向主机返回一个命令完成事件(Command Complete Event),通知主机复位完成。主机接收到复位完成事件后,读取并保存模块信息,包括版本信息、蓝牙地址和缓冲区大小等。其中的蓝牙地址将用于连接操 作,它在模块出厂时已经设定好,缓冲区大小参数将提交给主机,以便主机对要传输的数据进行分块。然后,主机将对模块进行初步设置,包括主机缓冲区设置和计 时器设置。通过HCI_Host_Buffer_Size指令,将主机缓冲区大小参数传递给模块,主机在对数据传输进行控制时将用到该信息。对于计时器, 包括查询时间值的大小、间隔等内容,模块默认了常用信息,实际应用中没有特别要求不用对其进行修改。但要应用相关指令将其读取出来并由主机保存,以便控制 时使用。在HCI的主机控制器和基带指令中有HCI_Read_xxx_Timeout指令,将返回这些计时器设置。
    (2)查询从蓝牙设备
    初始化完成后,开始进行查询(Inquiry),查询其它蓝牙设备。在Inquiry没有响应的情况下,系统进入该状态等待其它设备的连接请求。初步设置 完成后,系统将进行一次扫描,以便发现有效范围内的其它系统,从而决定本系统应处的状态。系统在开始的这次扫描后,将进行进一步的状态设置。 HCI_Inquiry指令将使系统进入寻找临近设备的状态,它的主要参数包括Inquiry_Length和Num_ Response。这里将产生程序的分支:如果找到临近设备,则系统设置为主设备,并发送连接请求;如果没有找到临近设备,那么在超过 Inquiry_Length时间之后,系统设置为从设备,并进入定期查询状态(HCI_Periodic_Inquiry_Mode),等待其它设备作 为主设备的连接请求。定期查询的参数则包括查询间隔、每次查询时间及允许应答的设备数等。
    (3)建立连接
    设备A作为主设备向设备B发送了连接请求, B的蓝牙模块接到该请求后向主机B发送一个连接请求事件(Connection Request Event),该事件中包含设备A的蓝牙地址、设备类型、链接模式等连接参数。设备B接收A的连接请求并发送指令 HCI_Accept_Connection_Request,同时用Role参数指定自己的角色。该指令发出后,设备A、B都将收到一个连接完成事件 (Connection Complete Event),该事件参数中包括了对方蓝牙地址、链接模式、加密方式以及连接句柄(Connection_ Handle),其中链接句柄是该连接的”名字”,对该连接的操作都将通过引用连接句柄进行。这样,两个设备间的连接就建立完成,可以进行数据传输了。中 断链接相对较为简单。链接的任一方发出中断指令,就可以中断链接。指令HCI_Disconnect中带有参数Connection_Handle,以表 示中断哪个链接。在当前数据传输操作完成后,A和B都将收到一个带有连接句柄的中断链接事件(Disconnection Complete Event)。
    (4)数据传输
    系统链接建立后,数据传输就比较简单了。因为通信信道已经建立,只需要向USB总线上发送要发送的数据即可。数据传输的一个重要内容是对要传输的数据进行 分组,以适应模块数据缓冲区的大小,这是以读取Buffer_Size的值为依据的。被拆分的数据还要根据蓝牙数据包格式的定义,加上数据包头,以便模块 对其进行正确的识别和处理。在软件中,专门针对这一要求编制了一个数据包处理例程,它的主要功能是数据包分组的拆分和重组。所要发送的数据进行蓝牙格式处 理后再组合成较大的数据块,该例程已被写入一个动态链接库(BCP_DLL.dl1)中,由界面应用程序调用。数据传输部分另一个重要内容就是针对USB 总线的编程。USB驱动程序并不直接与硬件对话,而是通过创建USB请求块(URB),并把它提交给总线驱动程序(USBD.SYS)来完成硬件操作。经 过前面的数据打包例程处理过的数据又将进行URB的接受实体,当它接收到送来的URB时,就会把驱动程序对其的调用转化为带有主功能的代码,来完成指定的 操作。由此,驱动程序首先要依照DDK中的规则创建URB。URB创建后,就可以使用它与USBD.SYS进行交互[16]。当然在本设计中,也可以完全 不用USB接口来传输数据,而直接由RS232串口来完成数据的传输。
    第四章 蓝牙数据传输系统软件设计模块
    本章节是整个论文的一个重点,主要论述了应用程序界面的设计以及实现的过程以及消息的发送与响应,接着讲述了对整个应用程序的设计过程,已经程序运行时的执行过程,最后完成了对整个应用程序性能的检测。
    4.1 蓝牙数据传输系统软件模块设计
    要想使用蓝牙设备进行数据传输,需要开发出适合于所用蓝牙设备的应用程序,基于上文所讲蓝牙系统工作流程,使用VC6.0开发一个适用于蓝牙DDP3303开发平台的应用程序。详细的设计过程如下所示:
    4.1.1 系统主界面的结构设计
    1.特殊消息类型及结构的设计
    基于BCP_DLL.dll开发的应用程序首先要初始化BCP,并向BCP注册,注册的内容包括:
     应用程序线程ID(Thread identifier)
     应用程序定义的用于接收BCP_DLL的消息
    如果注册成功,BCP将给该应用程序分配一个ID,用以区分多个应用程序。应用程序使用大部分命令时会需要将它的ID传递给BCP,以便将返回消息发给相应的应用程序线程。
    BCP_DLL是通过向应用程序线程发送消息来传递信息的,包括协议栈报告的错误状态、接收到对方设备请求的向上指示和接收到的数据等。应用程序接收到 BCP_DLL发送的消息并做出了相应的处理后,必须调用一个函数通知BCP_DLL作为对此消息的应答。BCP_DLL发送的消息如果是应用程序向 BCP_DLL注册的消息,那么这个消息带有两个参数,分别是:
    wParam BCP_MSG结构的指针。
    lParam BCP_MSG结构的长度。
    应用程序要对这些参数进行分析,BCP_MSG结构规定了参数的格式,BCP_MSG结构包括两大部分:
    MsgType(消息类型) 消息类型给出了BCP返回的消息种类。BCP通过这些消息向用户报告命令执行的结果、协议栈发给应用程序的指示信息和事件信息。
    MsgBody(消息体) 消息体是联合类型,内部包括多个结构,每一种结构都分别对应一个MsgType的消息所带的必要参数,但并不是所有的消息类型都有参数。
    所有消息的定义和BCP_MSG结构的定义在头文件BT_BCP.h中。
    2.系统主界面的设计
    主界面由菜单栏,对话框和状态栏三大部分组成,其中菜单栏有三个菜单选项,分别是:”编辑”,”查看”和”帮助”。下面说明主界面的设计步骤。
    第一步:选择File|New…菜单项,弹出NEW对话框,选择Projects标签,选中MFC AppWizard(exe)项,在Location编辑框中输入要建立的工程所在的目录,可以点击编辑框右边的省略号按钮选择一个已存在的目录,在 Project name编辑框中输入要建立的工程名称,在这里输入:TEST。
    第二步:在弹出的MFC AppWizard-Step1对话框中选择single document,即应用程序的类型为单文档模式,然后单击OK按钮。
    第三步:在弹出的MFC AppWizard-Step 6 of 6对话框中选择视图类CTestView,更改其基类名称为CFormView类,其余选项保持默认设置,然后单击OK按钮。
    第四步:在弹出的New Project Information对话框中点击Finish按钮,完成应用程序主框架的创建。
    完成主框架窗口的创建之后,点击运行,可以看到一个普通的应用程序界面,并不能实现我们想要完成的蓝牙数据传输的功能,为此我们还应该向应用程序中添加一些必要的控件,下面是整个界面的设计过程:
    首先,删除工具栏。本应用程序很少使用到工具栏,基本是通过对按钮控件的消息响应来完成蓝牙数据通信的功能。删除的方法也很简单,将框架类 CMainFrame的头文件MainFrm.h中声明的工具栏对象m_wndToolBar加”//”注释掉,再将CMainFrame类的成员函数 OnCreate中创建的该工具栏对象的一段代码进行同样的处理即可。
    其次,修改菜单。将”文件”菜单删除,使用Delete按钮即可删除,保留其余三个菜单,然后分别对这三个菜单的下拉菜单项作调整。其中,”编辑”菜单改 为”存储当前工作流程”和”载入上一次工作流程”两个菜单项;”查看”菜单改为”状态栏”选项;”帮助”菜单改为”关于蓝牙数据传输系统…”选项。菜单项 的名称,ID号和消息响应函数列于表4.2。
    最后,添加对话框。系统主界面中共放置了10个Button,1个Edit Box,10个Stitic Text,3个Combo Box,3个Group Box以及2个List Control和1个Progress。虽然对话框树目比较多,但在主界面中将它们按照蓝牙设备的操作顺序摆放在相应的位置,使得操作简洁。将这些对话框 的名称,属性,ID号和消息响应函数列于表4.3中(10个Stitic Text和3个Group Box已略去)[17]。
    表4.1 菜单项属性
    菜单项的名称 ID号 消息响应函数
    存储当前工作流程 ID_SAVE_WORKDREAM OnSaveWorkdream()
    载入上一次工作流程 ID_READWORK OnReadwork()
    状态栏 ID_VIEW_STATUS_BAR 无
    关于毕业设计演示程序… ID_APP_ABOUT ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

    表4.2 对话框属性
    属性 名称 ID号 消息响应函数
    Button 启动协议栈 IDC_BUTTONSTART OnButtonstart()
    注册服务 IDC_BUTTONREGSER OnButtonregser()
    注册RFCOMM信道号 IDC_BUTTONREGRF OnButtonregrf()
    查询设备 IDC_BUTTONINQ OnButtoninq()
    服务发现 IDC_BUTTONSEARCH OnButtonsearch()
    建立ACL连接 IDC_BUTTONLINK OnButtonlink()
    建立RFCOMM信道 IDC_BUTTONCONNECT OnButtonconnect()
    发送数据 IDC_BUTTONSEND OnButtonsend()
    断开RFCOMM信道 IDC_BUTTONUNCONNECT OnButtonunconnect()
    断开ACL连接 IDC_BUTTONUNLINK OnButtonunlink()
    Combo Box 注册的RFCOMM 信道号 IDC_COMBO5 无
    建立连接的设备地址 IDC_COMBO1 OnSelchangeCombo1()
    对方的RFCOMM信道号 IDC_COMBO2 无
    Edit Box 本地设备地址 IDC_STATIC1 无
    List Control 显示工作流程 IDC_STATUS 无
    数据传输 ID_LIST1 无
    服务发现 IDC_RESEARCH 无
    Progress 查询设备进度 IDC_PROGRESS1

    4.1.2 使用DLL调用的程序设计
    主界面设计完成后,就是要对单击界面按钮事件的响应,即需要使用BCP_DLL.dll提供的函数库来完成各个按钮标识符所标识的功能,下面是整个毕业设计主应用程序设计的相关介绍:
    1.系统初始化的设计
    系统初始化过程包括:启动蓝牙协议栈、注册服务、注册RFCOMM信道号三个步骤。而在初始化协议栈之前,还必须进行传输层的初始化,这个过程是在应用程序启动之前通过对一个组合框列表的选择来完成相应的初始化,主要是对蓝牙设备与主机的连接。
    (1)对传输层初始化所使用到的是DLL中的接口函数为void BCP_Init(BOOL UsbOrNot,UINT8 NumberOfCom);函数的作用为初始化BCP组件并选择传输层接口。当参数UsbOrNot为TRUE时选USB作为传输层接口;为FALSE时 选RS-232作为传输层接口。如果选择RS-232作为传输层接口,参数NumberOfCom制定串口号的值 ,1为”串口1″,2为”串口2″。
    实现传输层初始化的程序段如下,其中用来获取选择传输接口的ComboBox的ID号为IDC_COMBO1。
    //Test.cpp
    CComboBox m_SelTran;//定义ID号为IDC_COMBO1的编辑框的变量
    int Tran; //传输层的选择0:COM1,1:COM2,2:USB
    Tran = m_SelTran.GetCurSel();//返回编辑框中输入的选项转换为的整数值
    switch(Tran)
    {
    case 0:{
    m_pMainWnd->SetWindowText(”毕业设计 - COM1″);
    break; //选择COM1后设置的对话框名称
    }
    case 1:{
    m_pMainWnd->SetWindowText(”毕业设计- COM2″);
    break; //选择COM2后设置的对话框名称
    }
    case 2:{
    m_pMainWnd->SetWindowText(”毕业设计- USB”);
    break; //选择USB后设置的对话框名称
    }
    }
    //DiaTest.cpp文件
    switch(Tran)
    {
    case 0:{
    BCP_Init(false,1); //选择COM1后对传输层初始化
    Break;
    }
    case 1:{
    BCP_Init(false,2); //选择COM2后对传输层初始化
    Break;
    }
    case 2:{
    BCP_Init(true,1); //选择USB后对传输层初始化
    Break;
    }
    }
    在本次毕业设计中选择的是USB接口。
    (2)在启动BCP之前须向BCP注册应用程序线程ID以及接收消息类型。可以向BCP注册多个应用,注册可以在任何时刻,但是在启动BCP之前至少必须注册一个,并由该应用启动BCP。这个过程我们通过BCP_Register完成。具体函数代码如下所示:
    //DiaTest.cpp文件
    extern UINT8 ucCmpID;//定义变量存放线程ID号
    HANDLE MSGThread; //定义句柄
    DWORD dwThreadID; //定义应用程序线程ID
    MSGThread=CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0,
    (LPTHREAD_START_ROUTINE)ProcessBTMsg, NULL,
    0, &dwThreadID);//创建应用程序线程
    WM_BCP_MSG = RegisterWindowMessage(_TEXT(”WM_BCP_MSG”));
    //注册窗口消息
    ucCmpID = BCP_Register( dwThreadID, WM_BCP_MSG, MOD4);
    //将在BCP中注册的线程ID号附给变量ucCmpID
    if( ucCmpID == 0 )
    {
    //MessageBox(”BCP Register Error!”, “BCP Demo”,MB_OK);注册失败
    Process(48);// Process(int type)是一个自定义的输出字符串的函数,
    此时输出头文件中定义的第48个字符串
    return FALSE;
    }
    for (int i=0;i<30;i++) RegChannel[i]=0;
    //注册成功后,初始化30个信道标志位
    SetTimer(10,1000,NULL);
    //每隔1秒钟向应用程序的消息队列中放一个WM_TIMER消息
    (3)接下来就是要初始化蓝牙协议栈,初始化的作用一方面是将应用程序的线程ID注册到BCP中;另一方面是启动BCP,等待应用程序发送的消息。
    用于初始化蓝牙协议栈的接口函数为void BCP_Start(UINT8 ucCmpID),它的作用是启动BCP,参数ucCmpID是进行该项操作的应用程序ID。实现初始化蓝牙协议栈的程序段如下:
    void CDiaTest::OnButtonstart()
    {
    BCP_Start(ucCmpID);//启动BCP
    }
    启动BCP成功之后,在消息处理函数ProcessBTMsg()中处理成功返回的消息START_CNF,将本地的蓝牙地址显示在指定的对话框内。具体参考DiaTest.cpp文件注释。
    (4)接着就要注册本地RFCOMM信道号,因为注册的信道号只能在1到30之间,首先必须编程检测用户输入的值是否在1-30之间,可以通过对话框数据 检验(Dialog data validation,简称DDV)实现对用户输入值的检验。注册工程使用接口函数void BCP_RegisterChannel(UINT8 ucCmpID, UINT8 ucSeverChannel);向RFCOMM服务器注册RFCOMM服务器信道号,并且显示在指定的窗口内。具体的程序详见附录 DiaTest.cpp文件中的void CDiaTest::OnButtonregrf()函数。
    (5)然后就要点击”注册服务”按钮来完成注册本地服务。本应用程序提供了串口(Serial Port)服务,该服务类型及相关属性保存在SerialPort.dat文件中。为了成功注册该服务,此文件必须与可执行程序处于相同目录下。
    2.建立连接设计
    (1)点击”设备查询”按钮查询附近蓝牙设备,这一过程大概需要 10.24秒的时间,具体的流程可以观察”工作流程”窗口上方查询过程的进度条。此外只有那些处于可被发现的蓝牙设备才可以被查询到,具体程序详见附录 DiaTest.cpp文件中的void CDiaTest::OnButtoninq() 函数
    (2)点击”建立ACL连接”按钮,从下拉列表中选择一个已经查询到的蓝牙设备,就可以建立连接,具体代码参见附录DiaTest.cpp文件中的void CDiaTest::OnButtonlink() 函数。
    (3)建立ACL连接之后进行服务发现。通过服务发现可以获取远端注册的服务,具体结果将在”服务发现结果显示”窗口内显示,具体实现代码参加附录DiaTest.cpp文件中的void CDiaTest::OnButtonsearch() 函数。
    3.消息循环和消息处理的设计
    用户在点击”查询设备”按钮之后,就进入了该按钮的响应函数void CDiaTest::OnButtoninq()中,首先执行查询附近蓝牙设备的接口函数BCP_Inquiry(ucCmpID, InquiryLength, INQUIRY_MAX);其中参数ucCmpID是进行该项操作的应用程序ID,InquiryLength是查询设备的最长时间(1.28秒到 61.44秒),INQUIRY_MAX是查询设备接收的最多响应数。同时该函数返回消息INQUIRY_RESULT。本应用程序中设置 InquiryLength为8,则查询最长时间为10.24秒,INQUIRY_MAX为30,此外在该按钮响应函数中还设置了函数SetTimer (1,128,NULL),也就是说,每隔128毫秒Windows就要将查询设备函数BCP_Inquiry产生的消息放到消息队列中去,每当本数据传 输应用程序检索到该消息时,就将其发送到它的窗口响应函数void ProcessBTMsg()中,在指定的”工作流程”对话框中显示查询到的蓝牙设备地址。具体程序详见附录文件DiaTest.cpp。
    设备查询完毕之后,就要与远端设备建立ACL连接,这是通过接口函数void BCP_ReqLink(UINT8 ucCmpID, BDADDR tAddress, PageScanRepMode_T tPageScanRepMode, PageScanMode_T tPageScanMode,UINT16 tClockOffset, AcceptRoleSwitch_T tAcceptRoleSwitch);来实现的。连接建立成功之后返回消息LINK_CNF,然后进入此消息的响应函数void ProcessBTMsg()中,完成本地与远端设备之间的ACL连接。具体程序详见附录文件DiaTest.cpp。
    最后就是要建立RFCOMM信道,点击”建立RFCOMM信道”按钮进入窗口响应函数void CDiaTest::OnButtonconnect(),利用接口函数void BCP_ReqConnect(UINT8 ucCmpID, UINT8 ucServerChannelID, UINT16 acl_handle);实现在一条ACL连接上发出连接RFCOMM信道请求的命令,信道建立成功则返回消息CONNECT_CNF,当本应用程序从消 息队列中取到这条消息后,就进入此消息的响应函数void ProcessBTMsg()中,完成RFCOMM信道的建立,同时将建立连接的远端设备地址和信道号显示在相应的窗口内。具体消息参见下表:
    4.3消息类型及其意义
    消息类型 返回消息的意义
    START_CNF 启动BCP成功
    REGISTER_CHANNEL_CNF RFCOMM服务器信道号注册成功
    REGISTER_SERVICE_CNF 服务记录注册成功
    INQUIRY_RESULT 当前查询过程中的蓝牙设备查询响应
    LINK_CNF ACL连接建立成功
    UNLINK_CNF ACL连接断开成功
    DISCONNECT_CNF 断开RFCOMM信道成功
    DATA_CNF 数据已发送

    对于各种消息的处理参见DiaTest.cpp文件中的void ProcessBTMsg()函数。
    4.发送数据的设计
    首先选择发送数据的目的地,即远端设备的地址和目的设备注册的RFCOMM信道号,在发送数据之前首先弹出一个对话框,用来编辑所发送的数据。最后调用接 口函数void BCP_SendData(UINT16 uiHandle, UNIT8* pucData, INT16 uiLength);就可以发送数据了。参数uiHandle是用来发送数据的RFCOMM信道的句柄;pucData 是数据的指针,发送数据的内存应由用户来释放,本函数返回时即可释放;uiLength是发送数据的长度,必须少于128个字节。此函数返回消息 DATA_CNF表示数据已发送。实现发送数据的程序代码如下:
    void CDiaTest::OnButtonsend()
    {
    // TODO: Add your control notification handler code here
    CString rString;
    CDiaSend dlg;
    if (dlg.DoModal()==IDOK)
    {
    int m = m_LinkDevice.GetCurSel();
    int i = ChangeDeviceIndex(m); // 选择的设备地址序号
    int n = m_RfCommChannel.GetCurSel();
    int j = ChangeRfChIndex(i,n);// 选择的RFCOMM序号
    TempSendData = dlg.m_str;
    if(bt_device[i].dlc[j].dlc_handle == 0)
    {
    CString temp_str = STR_STATUS[52];
    MessageBox(temp_str,”蓝牙数据传输系统”);
    Return;
    }
    BCP_SendData(bt_device[i].dlc[j].dlc_handle,
    (UINT8 *)TempSendData.GetBuffer(TempSendData.GetLength()),
    TempSendData.GetLength());
    }
    }
    5.断开连接的设计
    数据发送完毕之后,还必须将已有的连接断开,包括断开RFCOMM信道和断开ACL连接,并且必须在断开ACL之前首先断开RFCOMM信道。其中断开 RFCOMM信道的程序段如下,用到的接口函数是void BCP_ReqDisconnect(UINT16 uiHandle),用来断开一条RFCOMM信道。参数uiHandle是断开的RFCOMM信道的句柄。返回消息DISCONNECT_CNF表示断 开RFCOMM信道成功。然后进入此消息的处理函数void ProcessBTMsg()中来处理这个消息,在”工作流程”对话框中显示”RFCOMM信道断开成功”的提示语。实现断开RFCOMM信道的程序段如 下:
    //DiaTest.cpp
    void CDiaTest::OnButtonunconnect()
    {
    int m = m_LinkDevice.GetCurSel();
    int i = ChangeDeviceIndex(m); // 选择的设备序号
    int n = m_RfCommChannel.GetCurSel();
    int j = ChangeRfChIndex(i,n); // 选择的RFCOMM序号
    BCP_ReqDisconnect(bt_device[i].dlc[j].dlc_handle);//断开RFCOMM信道
    }
    断开ACL连接的程序设计也与之相似,它用到的接口函数是void BCP_UnLink(UINT8 ucCmpID, UINT16 tHandle),参数ucCmpID是进行该项操作的应用程序ID,tHandle是需要断开的ACL连接句柄。返回消息UNLINK_CNF表示 ACL连接断开成功。然后进入此消息的处理函数void ProcessBTMsg()中来处理这个消息,在”工作流程”对话框中显示”ACL连接断开成功”的提示语,同时删除一个设备地址。实现断开ACL连接 的程序段如下:
    //DiaTest.cpp
    void CDiaTest::OnButtonunlink()
    {
    // TODO: Add your control notification handler code here
    // 选择的组合框序号
    int i=m_LinkDevice.GetCurSel();
    UINT16 Handle =0;
    //有RFCOMM信道时不能删除ACL
    if (i<0) return;
    for(int j=0; j
    {
    if (bt_device[i].dlc[j].dlc_handle != 0)
    {
    CString temp_str = STR_STATUS[53];
    MessageBox(temp_str,”蓝牙数据传输系统”);//弹出消息框
    Return;
    }
    }
    //断开ACL连接
    j=ChangeDeviceIndex(i);
    Handle = bt_device[j].acl_handle;
    BCP_UnLink(ucCmpID,Handle);
    }
    6.点对多点的设计
    点到多点的设计主要是建立主蓝牙设备和多个蓝牙设备之间的连接,因为一个主蓝牙设备可以和多达7个蓝牙设备实现建立ACL连接,所有已建立的ACL连接所 对应的远端蓝牙地址都显示在”建立连接设备”组合框内。为了实现该目的我首先编写函数ChangeDeviceIndex(int Index)返回所有建立连接的设备号。点击鼠标进入列表框”建立连接的设备地址”的消息响应函数void CDiaTest::OnSelchangeCombo1()中,完成所有建立连接的设备地址和信道号的显示,这样建立连接的设备地址和RFCOMM信道 号都在相应的下拉列表框中保存下来了,在点到多点连接中实现数据传输中其重要作用的另外一个函数int CDiaTest::ChangeRfChIndex(),它主要完成注册连接的RFCOMM信道号组合框中的选项与bt_device[]中的对应关系 的转换,关键代码如下所示:
    CString str;
    CString dst;
    char ch[6];
    int j=m_RfCommChannel.GetCurSel();
    m_RfCommChannel.GetLBText(j,str);
    for(int i=0;i
    {
    if (bt_device[acl].dlc[i].dlc_handle != 0)
    {
    char adr[6];
    sprintf(adr,”%d”,acl);
    dst=adr;
    if (bt_device[acl].dlc[i].direction) str+=” IN:”;
    else str+=” OUT:”;
    sprintf(ch,” %d”,bt_device[acl].dlc[i].channel_id);
    str+=ch;
    }
    if(memcmp(dst,str,sizeof(dst))==0) //判断选择的RFCOMM信道号
    {
    return i;
    break;
    }
    }
    4.2 蓝牙数据传输系统界面说明
    4.2.1 启动程序界面
    在VC++6.0的环境下,打开Test.dsw这个文件,编译链接并运行之后,将会显示如下的启动界面(如图4.1所示)。

    图4.1 启动界面
    下拉菜单中将会显示”串口1″、”串口2″和”通用串行总线”三个选项,若PC机上只有一个串口则选择”串口1″这个选项;若PC机上有两个串口则要视情 况而定,选择”串口1″或”串口2″;若将数据线插到USB接口上,则要选择”通用串行总线”这个选项,但此时还必须装上USB驱动程序,才能识别USB 接口并继续往下执行。
    4.2.2 观察窗口
    蓝牙数据传输系统的主窗口(如图4.2)内观察窗口用来显示程序运行过程的信息和数据,它们是:
    ● 工作流程:显示BCP运行过程中各步骤的信息。
    ● 数据传输:显示在RFCOMM信道上发送和接收到的数据及去向和来源。
    主窗口还显示以下各种信息:
    ● 本地设备地址:启动BCP后显示本地蓝牙设备地址。
    ● 注册的RFCOMM 信道号:显示注册的本地RFCOMM信道号。
    ● 建立连接的设备:显示建立ACL连接的所有远端蓝牙设备地址。
    ● RFCOMM信道号:显示建立在某个ACL连接上的所有RFCOMM信道。

    4.2 蓝牙演示程序主窗口
    4.2.3 菜单栏
    菜单栏中共有三个选项,分别是:”编辑”、”察看”和”帮助”(如图4.3所示)。
    编辑菜单栏中有两个选项:”存储当前工作流程”将当前”工作流程”观察窗口内的内容保存到DDP.txt文件中,以便分析;”载入上一次工作流程”可以将DDP.txt的内容显示到一个对话框中。
    察看菜单栏中有一个选项:”状态栏”,选中它可以在主窗口的最下方显示时间、日期等状态信息。
    帮助菜单栏中有一个选项:”关于蓝牙演示程序”,点击它可以显示制作人、版本号等帮助信息。

    4.3 菜单栏
    4.3 蓝牙数据传输系统执行步骤
    蓝牙执行过程有一定的流程,每一步的结果都会显示在”工作流程”观察窗口内。具体操作步骤如下:
    1 启动蓝牙协议栈
    点击”启动蓝牙协议栈”按钮。在这个过程中,应用程序向BCP注册,初始化并启动蓝牙协议栈。
    2 注册本地RFCOMM信道号
    在按下”注册RFCOMM信道号”按钮后的文本框中填入正确的RFCOMM信道号,该值为介于1~30之间的整数。这个信道号注册到RFCOMM服务器。
    3 注册本地服务
    点击”注册服务”按钮来完成注册本地服务。
    4 设备查询
    点击”查询设备”按钮查询附近蓝牙设备,这一过程需要大约十秒钟的时间,”数据传输”观察窗口上方显示查询过程的进度条。所有查询到的蓝牙设备地址将会显示在”工作流程”观察窗口中。
    只有那些处于可被发现的蓝牙设备才可以被查询到。
    5 建立ACL连接
    点击”建立ACL连接”按钮,从下拉列表中选择一个已经查询到的蓝牙设备,就可以与其建立ACL连接。
    建立ACL连接是完成后面工作的基础,服务发现和RFCOMM信道的建立都需要两个设备之间存在一条ACL连接。可以与多达7个设备建立ACL连接,所有已建立的ACL连接所对应的远端蓝牙地址都显示在”建立连接的设备”组合框内。
    6 服务发现
    建立ACL连接后,也可以进行服务发现。通过服务发现可以获取远端注册的服务。点击”服务发现”按钮即可。如果成功,会在”服务发现结果显示”列表框内显示服务发现的结果。
    7 建立RFCOMM信道
    建立ACL连接后,就可以建立两个端的RFCOMM信道了。在按下”建立RFCOMM信道”按钮后的文本框内填入远端RFCOMM服务器注册的 RFCOMM信道号,确认后远端就会弹出对话框询问是否接受连接请求,如果接受就可以建立一条RFCOMM信道。在一分钟内没有得到回应,本地端的 RFCOMM会自动断开RFCOMM信道。
    实际上,远端注册的RFCOMM信道号是通过服务发现过程获得的,是否可以建立RFCOMM信道也是根据服务发现的结果来进行判断的。演示程序忽略了这一 过程,直接由本地端在建立RFCOMM信道时输入。演示程序在两个蓝牙设备间可以建立多达60条RFCOMM信道。与某个设备建立的所有RFCOMM信道 都显示在”RFCOMM信道号”组合框中,格式为”方向:信道号”。
    8 数据传输
    RFCOMM模拟了一个设备串口。选择某个连接设备的某个RFCOMM信道后,按下”发送数据”按钮即出现文本框用于输入字符,确认后就可以将这些字符发 送到远端。另一方也可向本地发送字符,收发的字符都显示在”数据传输”观察窗口内这就是演示程序实现的简单的文字聊天功能。
    9 断开RFCOMM信道
    点击”断开RFCOMM信道”按钮,就会断开已经建立的RFCOMM信道。
    10 断开ACL连接
    点击”断开ACL连接”按钮,就会拆除已经建立的ACL连接。
    在拆除ACL连接时,演示程序要求只有在断开RFCOMM信道后才可以断开ACL连接。
    4.4 蓝牙数据传输系统测试
    整个应用程序完成设计之后就是对应用程序的检测,首先将蓝牙设备通USB接口与主机相连,启动生成的”毕设.exe”文件,注意在启动之前,需要将” SerialPort.dat”" BCP_DLL.dll”" USBDLL.dll”文件与exe文件放在同一个目录下。启动之后选择初始化端口为USB接口,然后进入程序主界面,下面是整个测试流程:
    1 初始化测试
    预期结果:在点击”初始化协议栈”按钮之前,应用程序完成了对接口的初始化以及注册应用线程ID。点击按钮之后,本地蓝牙设备地址出现在”本地设备地址” 旁边的编辑框中。分别点击”注册服务”和”注册RFCOMM信道号”按钮完成本机设备的初始化,流程显示在”工作流程”列表控件中。
    实际输出:启动蓝牙协议栈之后,本地设备地址00:06:6E:10:A7:32显示在列表框中,注册的信道号1显示在列表框中,并在工作流程列表控件中显示注册RFCOMM信道号成功。
    图片演示:

    a.初始化协议栈

    b.注册RFCOMM服务信道号

    c.注册服务
    4.5 初始化演示
    2 连接建立测试
    预期结果:点击”查询设备”按钮,此时在进度控件中会显示查询进度,大概耗时10.24秒;然后点击”建立ACL连接”按钮会弹出一个对话框显示查询到的 设备,选择一个要建立连接的设备,点击确定按钮之后,会在”建立连接设备”编辑框中,并在工作流程中显示”ACL建立连接成功”。
    实际输出:实际输出显示对方设备地址00:06:6E:10:A7:32,工作流程列表控件如图所示。
    图片演示:如图4.6

    a.查询设备

    b.建立ACL连接

    c.建立RFCOMM连接
    图4.6 连接建立演示
    3 数据发送测试
    预期输出:首先点击”建立RFCOMM信道”按钮,建立RFCOMM连接。点击按钮之后会弹出一个输入对方设备注册的RFCOMM信道好的对话框,输入对 方注册的信道号,然后点击”发送数据”按钮,弹出一个文本编辑框,输入要发送的数据”hello world”之后,在数据发送列表控件中显示相应的发送数据。
    实际输出:数据发送列表控件中显示远端设备地址为00:06:6E:10:A7:32,信道号为0×03,信道方向为DLC_OUT,传送的数据为”hello world”同时工作流程中显示”发送数据成功.”。
    图片演示:如图4.7

    图4.7 发送数据演示
    4 断开连接测试
    测试内容:数据发送后如需关闭程序,首先要断开RFCOMM连接,然后在断开ACL连接。我们先点击”断开RFCOMM连接”按钮,接着点击”断开ACL连接”按钮即可完成相应操作。
    实际输出:点击断开RFCOMM信道,然后点击断开ACL连接,此时发送数据框变灰色,并在工作流程列表控件中显示断链成功。
    图片演示:如图4.8

    图4.8 断开连接演示

    第五章 总结
    5.1调试过程中遇到的困难及解决方法
    在本次毕业设计过程中我碰到了各种各样的问题,有些是因为自己对控件功能的不熟悉造成,有些是对基本语法的掌握能力不高造成,还有些是用户手册了解不是很深造成的。
    我将在本次毕业设计中碰到的一些问题以及解决方法,还有个人的一点思考写在下面以做共勉。
    1、 C++语言较之C语言有许多共同的地方,但是也有其不同的地方,比如增加了面向对象。在学习过程中我们不但要注意到它们的共同点,更要对它们的不同点多加思考以求掌握
    2、 在C++语言中还有一个this指针的频繁使用值得大家思考,如果大家很好掌握了这个指针将会发现这个指针在我们的程序设计过程中会帮助我们很多,关于这方面的东西大家应该多多上网查些资料。
    3、 在学习Visual C++ 6.0进行程序设计中要注意到VC是基于消息响应的,所以在学习过程中我们要首先理解整个程序的运行过程以及如何进行消息相应,只有真正弄懂了这些,VC才能被我们方便的使用。
    4、 关于VC动态链接库的问题设计到动态调用和静态调用,由于本次毕业设计中使用到了BCP_DLL.dll文件,因此我们要对动态链接库方面的知识有个详细的了解,包括如何使用动态链接库。
    5、 本次毕业设计中我们使用USB接口实现了蓝牙设备与主机之间的连接,在运行程序时发现不能正常初始化协议栈,如果出现这个问题就需要我们设置断点来检查可 能出现错误的地方。还有在查询设备的时候由于我们设置了查询的最长时间是10.24秒,所以在查询过程中不要急于看到结果而忽略到这个问题。
    5.2 工作总结
    该应用程序主要建立在对按钮事件的响应,以及对BCP_DLL.dll文件提供的蓝牙接口函数产生的各种消息的响应。通过对这些消息的响应完成了各种功能。
    本毕业设计主要完成了基于蓝牙设备的无线数据传输,在进行软件开发之前,我首先详细阅读了蓝牙演示开发平台基本核心协议组件用户手册,详细了解了各个蓝牙 接口函数的作用以及该函数所产生的消息体成员的具体含义。接着在图书馆借了几本关于Visual C++ 6.0的书,了解整个VC程序的开发流程与方法,并着手设计软件界面。由于在本次设计中涉及到对动态链接库的使用,我着重参看了这方面的内容,并选择隐含 链接使应用程序链接到BCP_DLL.dll。最后就是着手对各个消息事件的响应,从而完成蓝牙设备数据传输的功能。
    本系统经实际测试,完成了点到点以及点到多点的数据传输的功能。
    测试结果表明,所设计的蓝牙数据传输系统能够实现发送和接收数据要求,并且具有很好的可靠性和实时性。由于具有很高的性能价格比,采用蓝牙的短距离无线数据传输系统具有很好的市场前景。
    5.3收获与心得
    长达三个月的毕业设计已经接近尾声,在这段时间里通过老师的帮助以及自身的努力基本完成了任务要求,并培养了自己主动发现问题,思考问题,解决问题的能力,通过对Visual C++6.0的学习培养了自己的自学能力,对今后其它语言的学习打下了良好的基础。
    第一,合理安排毕业设计进度。从接到毕业设计论文题目之后,我就开始有条不紊的着手进行毕业设计。首先是资料搜集阶段,广泛查阅各种资料,去图书馆借相关资料书籍,接着就是对各种资料的消化理解运用,最后着手进行程序设计。
    第二,熟练掌握了Visual C++ 6.0如何开发一个MFC应用程序,虽然只是了解了一个皮毛,但是通过这段时间的学习,我了解到应该如何去学习一门编程语言,就算以后我从事与VC无关的 工作,我仍可以把在本次毕业设计中得到的经验合理利用到我所从事的领域,相信对我的学习过程会有很大的帮助。
    第三,提高了我自己动手发现问题解决问题的能力,在本次毕业设计过程中碰到了许多各种各样的问题,在发现问题的过程中通过自己的思考和老师的帮助下去尝试 解决问题,从中我学到了很多东西并体会到了只有自己认真思考了知识才真的属于你。在本次毕业设计过程中我还提高了自己对中英文材料检索的能力,在开始的资 料收集阶段通过互联网,图书馆查询各种与我毕业设计相关的资料,在这个搜索过程中获得了各种各样的技巧,相信对我以后的工作会有很大的帮助。
    5.4设计展望
    本毕业设计虽然实现了蓝牙基本的数据传输,但仍有许多地方需要进一步改进和完善。
    首先在点到多点数据连接中我只完成了一个主设备对从设备的连接过程中,没有考虑到一个蓝牙设备既可以是主设备又可以是从设备。
    其次在本次毕业设计中我只完成了数据传输,在更多的应用中是进行文件传输,由于动态链接库提供的Bcp_SendData函数有字节限制,一旦大小超过限制就要进行拆包操作。
    最后我们还可以通过蓝牙设备建立音频视频连接,但是在本次毕业设计过程中没有反映。这个过程也可以通过动态链接库提供的接口函数实现的。
    随着蓝牙技术的成熟以及蓝牙芯片价格的下降,蓝牙技术将会在各个领域有个更为广泛的应用。
    参考文献
    [1] Bluetooth: Raffaele Bruno, Marco Conti, Enrico Gregori.Architecture, Protocols and Scheduling Algorithms [J]. Cluster Computing, 2002, 5 (2):117-131
    [2]蓝牙技术 http://info.tele.hc360.com/html/001/001/011/42986.htm
    [3]杜丰.蓝牙技术面临挑战.[J].现代电子技术,2004,(20):74~77.
    [4]邓永红.详解蓝牙技术.[J].有线电视技术,2005,(5):6~11.
    [5]李琦.蓝牙技术和应用.[J].青海师专学报,2005,(6):83~85.
    [6] 浅谈蓝牙技术、产品与应用 http://info.it.hc360.com/2006/04/181745136335.shtml
    [7]蓝牙市场及应用.http://www.damayi.com/default.asp.
    [8]蓝牙技术在中国的发展分析.[J].中国通信信息,2002.2.5.
    [9]蓝牙在中国.http://www.proteam.com.cn/bluetooth.
    [10]无线风光在蓝牙.http://www.damayi.com/default.asp.
    [11]金纯等.蓝牙技术[M].北京:电子工业出版社.2001.
    [12]符鹤,周忠华,彭智超.蓝牙技术的原理及其应用.[j].微型电脑应用,2006,7(3):60~61
    [13]刘海文等.蓝牙技术及系统原理[M].北京:电子技术出版社.2000.
    [14]黄丽.面向家庭网络的蓝牙技术研究与实践[M].合肥:工业大学出版社.2003. 11
    [15]王晖等.精通Visual C++ 6.0[M].北京:电子工业出版社,1999.3.
    [16]张元.基于蓝牙的微机无线数据传输系统.[J].仪器仪表用户杂志, 2004.11:56~58
    [17]席庆 张春林.Visual C++ 6.0[M].北京:中国水利水电出版社,1999.10

    展开全文
  • 之前的电路已经使用了一年了,没出过什么故障,就是功耗特别大,静态工作电流能达到50ma,板子上使用了单片机、射频卡模块、蓝牙串口模块等,采用的是刷卡开门,手机蓝牙串口软件管理用户,模块太多,再加上之前经验...

    最近给实验室做了新的门禁电路板。之前的电路已经使用了一年了,没出过什么故障,就是功耗特别大,静态工作电流能达到50ma,板子上使用了单片机、射频卡模块、蓝牙串口模块等,采用的是刷卡开门,手机蓝牙串口软件管理用户,模块太多,再加上之前经验有限,只能是拉了一根电线过去,在门框上绕一周去供电。

    现在重新设计了门禁,淘汰刷卡开门的方式,改成了微信小程序开锁。于是,电路板上就去掉了之前的“耗电大户“单片机和射频卡等模块,蓝牙也换成了一款低功耗的蓝牙模块,再加上电路设计上的考虑,已经算是达到了低功耗的要求。


    一、门禁电路设计要求:

    1、4节五号电池供电,要求功耗低

    2、上拉门把手锁门

    3、电量检测,且具有低电量提醒功能

    二、设计思路:

    列出来看,电路设计要求不算多,但重点就在于这个低功耗怎么实现,就这点功能也没有必要使用单片机了,毕竟功耗也挺大的,所以绝大部分的电路就需要使用模拟电路来实现。

    4节干电池的电压为4.8V,蓝牙模块(使用的型号为JDY-16,某宝有售)的工作电压写的是3.3V,需要使用稳压芯片,但是是芯片就会耗电……突然冒出一个富有大无畏牺牲精神的想法:试试5V电压会不会把模块烧坏……然后就试了,还真没有炸啊,连接也挺稳定。

    上拉门把手锁门是一般门锁常用的方式,但他们大多是在机械式得把门栓伸出去,再次下拉把手开门时还是可以打开,就是说没有触发门锁内部的马达转动。所以设计中在门锁内部固定了一个按键,当上拉把手时就会产生一个信号给电路板。

    没有MCU做AD采集来检测电压的方法,只能是使用比较器电路,提示使用蜂鸣器。

    三、电路分析:

    1、接口电路:

    电路板通过8P的排线和锁内部相连。

    YS是按键信号,使用大电阻下拉到地,默认状态是低电平,触发后是高电平,M1和M2是电机控制线。

    2、蓝牙模块:

    间歇广播模式下的功耗可以达到40uA以下,可以说已经非常省电了,可以与微信小程序、APP进行通信,恰好符合设计要求。

    控制开关锁最终要控制的就是IO的电平变化:使用小程序开锁---->即让蓝牙模块的IO发生变化---->IO默认低电平---->变成高电平时开锁。

    3、驱动电路:

    使用集成的H桥驱动芯片L9110S,静态电流2uA,可以一直供电。

    根据之前的分析,需要让IO为高电平时开锁,此时YS被下拉到地电平,可以开锁。

    当YS为1时,要让IO为0,恰好蓝牙模块的IO口默认电平为低电平。

    4、电压检测报警:

    基准电压:进行电压比较,需要有个不随外部供电电压变化的基准电压才行:

    使用基准电压芯片LM336,使用它得到了一个基准电压值约为1V的电压,若使用500K的电阻,芯片实际上是没有正常工作的,因为电流过小,但是经过实际的测试,当电压从3V变化到5V的时候,基准电压的变化范围很小,在0.95V~1.05V之间,可以近似的认为电压不变。

    电压比较:想不到什么好的办法,只能使用集成芯片,将供电电压分压得到VCC/3,用它和1V作比较,即电压小于3V的时候蜂鸣器就发出提示,蜂鸣器使用三极管做驱动。

    5、低功耗设计:

    因为使用了集成比较器芯片,而它的耗电量很大,达到了mA级别,不得不控制一下,设计如下电路:两个PNP组成的复合管做电量检测部分电路的总开关,只用蓝牙模块的STAT引脚输出为低电平时才会导通,给后面的电路供电。而这个STAT引脚是蓝牙连接状态指示引脚:未连接时为0,连接上为1,逻辑恰好相反,于是使用三极管做个反相器。

    于是,便只有在蓝牙连接上的时候才会检测一下电池电量,若电量低就发出提醒。未连接蓝牙时就停止这一部分电路的供电,达到低功耗的目的。

    四、实际电路

    经过实际测试,电路静态电流50uA,大部分为蓝牙模块定时广播产生的损耗,驱动电机转动时电流约270mA。四节电池至少可以使用1年。

    展开全文
  • 前言: 本文描述了一个由STM32微处理器、步进电机、蓝牙,L298N等...控制小车的转动模式通过蓝牙模块来实现,利用手机蓝牙助手和蓝牙模块相通,进而控制小车的各种运转模式。 代码、蓝牙Android apk地址:https://g...

    前言:

    本文描述了一个由STM32微处理器、步进电机、蓝牙,L298N等模块构成的。该系统采用STM32微处理器为核心,在MDK环境下进行编程,通知控制L298N模块IN1~IN4引脚的高低电平进而控制电机的转动方向,使小车产生不同的转动模式。控制小车的转动模式通过蓝牙模块来实现,利用手机蓝牙助手和蓝牙模块相通,进而控制小车的各种运转模式。 代码、蓝牙Android apk地址:https://github.com/daohewang/Bluetooth-intelligent-car
    在这里插入图片描述

    整体框架:

    下面的图把核心连接部分都画出来了(其他部分按要求接就可以了,Vcc接电源,GND接地即可),图画的有点丑,希望大家不要介意呀(>-<)
    在这里插入图片描述

    硬件设计:

    使用微控制器为STM32F103RC,其芯片引脚如图所示
    在这里插入图片描述

    1. 芯片上所连接的部分:
      PC10 -> IN1; PC11 -> IN2; PC12 -> IN3; PD2 -> IN4; 这里芯片上的GPIO口连接是随机的,可以根据自己的方便选择。不过这里要注意的是,IN1和IN2是控制左电机的,IN3和IN4是控制右电机。因为这里我用来驱动电机的是L298N。接线的话左电机接输出A端口,每个孔接一根线,如果要驱动两个左电机的话,也是一样接法,每个孔接一根电机线。右电机接输出B 。
      这里要注意的是驱动小车转动需要接外接电源,也就是图片上的12V供电部分。外接电源正极接到12v供电口上,负极接到供电GND上,还有要注意的一点就是还要将开发板上的地接到供电GND上,保证电源和开发板共地。
      如图所示:
      在这里插入图片描述

    L298N逻辑电平表

    在这里插入图片描述
    2. JDY 30蓝牙模块
    JDY-30 透传模块是基于蓝牙 2.1 协议标准,工作频段为 2.4GHZ 范围,具有信号强、数据传输快、性能稳定等特性。支持蓝牙 SPP 串口协议,内置 PCB 天线,支持 UART 接口,蓝牙 Class 2,数据传输比 BLE 蓝牙快、可达到几十 K 每秒以上的速率。如图3.2所示。
    在这里插入图片描述
    实物图:
    在这里插入图片描述
    引脚功能说明
    1 、 UART-TX 串口输出,接开发板上的UART-Rx,电平为 TTL 电平
    2 、 UART-RX 串口输入,接开发板上的UART-Tx,电平为 TTL 电平
    3 、 VCC 3.3V 电源
    4 、 GND 电源地

    Android蓝牙助手已经包含到代码代码里了,直接下载即可。使用手机APP蓝牙连接JDY–30蓝牙模块。如图所示

    在这里插入图片描述
    这里的蓝牙助手使用方法要情调一下,可能有些同学不太会,点击右上角的连接按钮,先让手机连上蓝牙模块,一般连上了蓝牙模块上的灯都不会闪烁。以此判断有没有连接上。接着就是编辑键盘的小车的运动方式了,按照下面的来设置就可以了。这里的数字是我代码设置好的,可以按照自己的要求填写。
    在这里插入图片描述

    软件设计:

    软件流程图:

    首先对前进,后退,左转,右转,停止进行宏定义,单片机接收到蓝牙串口的相应指令,然后在if语句中进行比较,如果有相对应的,触发相对应的宏定义。流程图如图所示。在串口USART1中接收到的数据进行比较,暂停、前进、后退、左转、右转、原地左转,原地右转。启动字符为 “0”,“1”,“2”,“3”,“4”,“5”,“6”。

    在这里插入图片描述

    代码部分:

    电机驱动代码

    1.motor.h

    #ifndef _MOTOR_H
    
    #define _MOTOR_H
    
    void MotorInit(void);
    
    void Turnleft(void);
    
    void Turnright(void);
    
    void Turnback(void);
    
    void Turnfront(void);
    
    void Stop(void);
    
    void Leftaround(void);
    
    void Rightaround(void);
    
    #endif 
    
    

    2. motor.c

    #include "STM32F10X.h"
    #include "motor.h"
    
    void MotorInit(void)
    {
    	
    	//初始化和使能单片机上的GPIO端口,保证可以正常给端口高低电平
    	GPIO_InitTypeDef GPIO_InitStructure;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
    	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
    	GPIO_Init(GPIOC, &GPIO_InitStructure);
    	GPIO_SetBits(GPIOC, GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_6);
    //	MOTOR_APB_PERIPH_FUNG(MOTOr_APB_PORT , ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);
    	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2;
    	GPIO_Init(GPIOD, &GPIO_InitStructure);
    	GPIO_SetBits(GPIOD, GPIO_Pin_2);
    }
    
    
    //停止模式
    void Stop(void)
    {
    	GPIO_ResetBits(GPIOC,GPIO_Pin_10);
    	GPIO_ResetBits(GPIOC,GPIO_Pin_11);
    	GPIO_ResetBits(GPIOC,GPIO_Pin_12);
    	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
    }
    
    
    //左转模式 -> 左电机正转,右电机反转
    void Turnleft(void)
    {
    	GPIO_SetBits(GPIOC,GPIO_Pin_10); 
    	GPIO_ResetBits(GPIOC,GPIO_Pin_11);
    	GPIO_ResetBits(GPIOC,GPIO_Pin_12);
    	GPIO_SetBits(GPIOD,GPIO_Pin_2);
    	GPIO_SetBits(GPIOC,GPIO_Pin_6);
    }
    
    //右转模式 -> 左电机反转,右电机正转
    void Turnright(void)
    {
    	GPIO_ResetBits(GPIOC,GPIO_Pin_10);
    	GPIO_SetBits(GPIOC,GPIO_Pin_11);
    	GPIO_SetBits(GPIOC,GPIO_Pin_12);
    	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
    	GPIO_SetBits(GPIOC,GPIO_Pin_6);
    }
    
    //后退模式 -> 左电机反转,右电机反转
    void Turnback(void)
    {
    	
    	GPIO_ResetBits(GPIOC,GPIO_Pin_10);
    	GPIO_SetBits(GPIOC,GPIO_Pin_11);
    	GPIO_ResetBits(GPIOC,GPIO_Pin_12);
    	GPIO_SetBits(GPIOD,GPIO_Pin_2);
    	GPIO_SetBits(GPIOC,GPIO_Pin_8);
    	
    }
    
    //前进模式 -> 左电机正转,右电机正转
    void Turnfront(void)
    {
    	GPIO_SetBits(GPIOC,GPIO_Pin_10);
    	GPIO_ResetBits(GPIOC,GPIO_Pin_11);
    	GPIO_SetBits(GPIOC,GPIO_Pin_12); 
    	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
    	GPIO_SetBits(GPIOC,GPIO_Pin_7);
    }
    
    //以左电机为中心原地左转
    void Leftaround(void)
    {
    	GPIO_SetBits(GPIOC,GPIO_Pin_10);
    	GPIO_ResetBits(GPIOC,GPIO_Pin_11);
    	GPIO_SetBits(GPIOC,GPIO_Pin_12);
    	GPIO_SetBits(GPIOD,GPIO_Pin_2);
    	
    }
    
    //以右电机为中心原地右转
    void Rightaround(void)
    {
    	GPIO_SetBits(GPIOC,GPIO_Pin_10);
    	GPIO_SetBits(GPIOC,GPIO_Pin_11);
    	GPIO_SetBits(GPIOC,GPIO_Pin_12);
    	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
    	
    }
    
    
    

    3. main函数

    #include "MOTOR.h"
    #include "stm32f10x.h"         //官方库
    #include "stm32f10x_gpio.h"
    #include "stm32f10x_rcc.h"
    #include "stm32f10x_it.h"
    #include <stdio.h>
    
    
    /*
    
    #ifdef->endif的内容部分和PUTCHAR_PROTOTYPE{}的内容属于C语言的语法规则引入,
    所以头部必须引入#include<stdio.h>,这样子的话C语言的语法就可以完美引用
    
    */
    
    
    #ifdef __GNUC__
      /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
         set to 'Yes') calls __io_putchar() */
      #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    #else
      #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    #endif /* __GNUC__ */
    
    
    //中断服务函数  
    u8 i;
    u8 flag;  //定义一个标志位
    void USART1_IRQHandler(void)  
      
    {  
         if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)      //检查指定的 USART1 中断发生与否
          { 
    			USART_ClearITPendingBit(USART1, USART_IT_RXNE);   //清除 USART1 的中断待处理位
    			GPIO_ResetBits(GPIOC,GPIO_Pin_6);                 //设置LED灯作为中断发生与否的指示灯
    			i=  USART_ReceiveData(USART1);                    //返回 USART1 最近接收到的数据
    		//if语句的内容部分可以保证蓝牙接收到的flag数据是正确的,如果不加的话会导致接收不到正确的数据
    		  if(i=='0')
    				{                 
    					 flag=0;
    				}
    				
    			if(i=='1')
    				{
    					 flag=1;
    				}
    				
    			if(i=='2')
    			   {
    					 flag=2;
    				}
    			   
    			if(i=='3')
    			   {
    								 
    					flag=3;
    			   }
    			   
    			if(i=='4')
    			  {
    					flag=4;
    			  }
    			  
    			if(i=='5')
    			  {
    					flag=5;
    			  }
    			  
    			if(i=='6')
    			 {
    					flag=6;
    			 }
    
    		  }
    		  
    //		  USART_ClearITPendingBit(USART1, USART_IT_RXNE);
          }
    	  
    	  
    int main(void)
    {
    	
    	//利用中断进行蓝牙的收发
    	
    	  GPIO_InitTypeDef GPIO_InitStructure;
    	  USART_InitTypeDef USART_InitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;
    
    	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
    // 	USART_DeInit(USART1);  //复位串口1
    //  USART1_TX   PA.9
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
        GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
       
        //USART1_RX	  PA.10
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10     
    	
    	 
        /* USARTx configured as follow:
           - BaudRate = 9600 baud  波特率
           - Word Length = 8 Bits  数据长度
           - One Stop Bit          停止位
           - No parity             校验方式
           - Hardware flow control disabled (RTS and CTS signals) 硬件控制流
           - Receive and transmit enabled                         使能发送和接收
        */
    		USART_InitStructure.USART_BaudRate = 9600;
    		USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    		USART_InitStructure.USART_StopBits = USART_StopBits_1;
    		USART_InitStructure.USART_Parity = USART_Parity_No;
    		USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    		USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    
    		USART_Init(USART1, &USART_InitStructure);
    		USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
    
        //Usart1 NVIC 配置
          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
          NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    	  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
    	  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
    	  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	  NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
          USART_Cmd(USART1, ENABLE);                    //使能串口 
    	  MotorInit();
    	  
    	  
    	  //蓝牙数据接收判断函数
    	  while(1)
    	  {
    		
    		  switch(flag)
                  {
    					case 0:  Stop();         break  ;
    					case 1:  Turnleft();     break  ;
    					case 2:  Turnright();    break  ;
    					case 3:  Turnback();     break  ;
    					case 4:  Turnfront();    break  ;
    					case 5:  Leftaround();   break  ;
    					case 6:  Rightaround();  break  ;
                        default: Stop();         break  ;                                                                                                
    	          }		  
    	  }
    	  
    }
    
    PUTCHAR_PROTOTYPE
    {
      /* Place your implementation of fputc here */
      /* e.g. write a character to the USART */
     USART_SendData(USART1, (uint8_t) ch);
    
      /* 循环等待直到发送结束*/
      while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
      {}
    
      return ch;
    }
    
    

    以上就是蓝牙智能小车的全部部分了,完整代码可以到我的GitHub上进行下载,下载地址:https://github.com/daohewang/Bluetooth-intelligent-car如果还有问题的话,欢迎下方留言咨询。

    展开全文
  • 想知道安卓上如何进行蓝牙开发吗?想为智能硬件的开发做基础准备吗?这一章开始,我们将带你感受安卓上蓝牙应用的开发。本系列会浅显的讲解每一个蓝牙开发可能会用到的技术点,图文并貌,将它们串起来后,会实现一个...
  • 蓝牙设计 低功耗

    2014-08-05 12:20:35
    答:蓝牙通讯最初设计初衷是方便移动电话(手机)与配件之间进行低成本、低功耗无线通信连接,现在已经成为IEEE802.15标准,得到全球上万家厂商支持。   2. 问:如果从事蓝牙开发有没有前途? 答:严格地...
  • 蓝牙4.0设计 CC2540

    2013-10-10 22:35:45
    答:蓝牙通讯最初设计初衷是方便移动电话(手机)与配件之间进行低成本、低功耗无线通信连接,现在已经成为IEEE802.15标准,得到全球上万家厂商支持。   2. 问:如果从事蓝牙开发有没有前途? 答:严格地说,这...
  • 智能蓝牙技术原理及设计方案集锦 UMTS“蓝牙”( Bluetooth)技术是由世界著名的5家大公司——爱立信(Ericsson)、诺基亚(Nokia、东芝(TOShiba)、国际商用机器公司(IBM)和英特尔(Intel),于1998年5月联合...
  • 蓝牙是目前最常见的无线连接方式
  • 主流蓝牙芯片设计厂商(2019)最新排名 近十年来,蓝牙应用越来越广泛,在音频、键鼠、物联网等领域越来越普及,在广东珠三角一带,更是聚集了上万家蓝牙产品制造厂商。目前全球蓝牙射频芯片厂家众多,在不同领域...
  • 设计介绍了利用Visual C++进行串口通信编程的方法和技巧,目的是实现蓝牙间的串口通信。本文主要针对MSComm控件进行通信编程的基本方法、属性和事件做了介绍,同时也概括的介绍了计算机接口技术、串口通信和蓝牙...
  • 本模块支持RS232串口以及RS485总线接口,并支持SPP蓝牙串口协议,具有成本低、体积小、功耗低、收发灵敏性高等优点,使用灵活。二.特点:三、宏进蓝牙串口助手接线示意图四、蓝牙串口模块外部接口连接示意图。五、...
  • 本模块支持RS232串口以及RS485总线接口,并支持SPP蓝牙串口协议,具有成本低、体积小、功耗低、收发灵敏性高等优点,使用灵活。二.特点:三、宏进蓝牙串口助手接线示意图四、蓝牙串口模块外部接口连接示意图。五、...
  • 关于蓝牙设计的问题

    2014-03-27 15:00:15
    答:蓝牙通讯最初设计初衷是方便移动电话(手机)与配件之间进行低成本、低功耗无线通信连接,现在已经成为IEEE802.15标准,得到全球上万家厂商支持。   2. 问:如果从事蓝牙开发有没有前途? 答:严格地说,这...
  • 第五章 系统设计5.1 系统总体设计 系统设计总体分为两个部分,它们分别是手机端软件系统设计和计算机端软件系统设计。系统总体示意图如下。图16 系统总体示意图5.2 手机端软件系统设计 5.2.1 子系统(模块)划分 ...
  • 声明:这篇文章是楼主beautifulzzzz学习网上关于蓝牙的相关知识的笔记,其中比较多的受益于xubin341719的蓝牙系列文章,同时还有其他网上作者的资料。由于有些文章只做参考或统计不足,如涉及版权请在下面留言~。...
  • 继承蓝牙内置协议内置协议简要说明设置蓝牙传输协议创建异步发送数据任务创建同步发送数据任务方式二:原始数据收发设置原始数据收发监听发送数据 Bluetooth 该库的特点 内部集成了多种蓝牙芯片的操作,能兼容几.
  • 本文介绍了针对硬件通过蓝牙传输来与苹果产品包括Mac,iPhone和iPod touch等交互的设计指南。为了能够与苹果产品兼容,现在和未来的设计当中,蓝牙计入都应该遵循本文中的规范。本文主要分为两个部分:通用需求描述...
  • 答:蓝牙通讯最初设计初衷是方便移动电话(手机)与配件之间进行低成本、低功耗无线通信连接,现在已经成为IEEE802.15标准,得到全球上万家厂商支持。 2. 问:如果从事蓝牙开发有没有前途?答:严格地说,这不是一...
1 2 3 4 5 ... 20
收藏数 10,506
精华内容 4,202