引言
作为一种短距离无线通信协议,蓝牙技术以其低成本、低功耗、高速率、方便灵活等特点在众多无线解决方案中脱颖而出。蓝牙10m的工作距离可以很好的满足大多数数字设备的应用场合,如办公室或家庭。打印机是常用的一个设备,摆脱打印机连线所带来的不便,实现无线打印,可以减少桌面上令人不快的电缆,并且可以将打印机远离主机任意搬动,摆放在房间中适合的位置。本文介绍一种用蓝牙技术来实现主机与打印机的无线连接,实现遥控打印的方法。
蓝牙打印机的设计方案
设计的总体思路如图1所示:
图1 蓝牙打印机设计的总体思路
在主机端用一单片机来仿真打印机进行工作,截取从主机并口传出的数据及控制信号,并通过蓝牙无线连接传送到打印机端。在打印机侧的单片机则根据所收到的蓝牙数据来仿真主机对打印机进行控制操作,从而实现打印机与主机的蓝牙无线连接。主机端的蓝牙作为主设备进行查询和发起连接,打印机端的蓝牙则作为从设备等待连接的建立。单片机采用89C2051,蓝牙芯片采用爱立信公司生产的支持点对点连接的ROK101-008。该模块内包括了无线部分、基带控制器、闪存、电源控制模块和内部时钟这五个主要部分,提供UART、PCM、I2C标准接口并内置晶振,其硬件框图如图2所示:
图2 Ericsson ROK 101 008 硬件框图
该方案适用于具有Centronic并行接口的通用打印机。用户无须更改打印机的驱动程序,只需将含有单片机和蓝牙的两块板子分别连接到主机端和打印机上,就可以进行无线打印了。整个过程对于原打印机驱动程序是透明的,这样就为打印机用户提供了很大的方便。
单片机对蓝牙模块的控制
图3 蓝牙HCI传输层示意图
蓝牙规范定义了主机控制接口(HCI),它为基带控制器、硬件控制器、硬件状态和控制寄存器等提供了标准的命令接口。主机通过HCI传输层将控制命令和数据发送给蓝牙模块,而蓝牙模块又通过HCI传输层将其状态信息及数据发还给主机。HCI传输层的主要目的是实现透明性。传输层不需要对主控制器驱动程序传送给主控制器的数据可见,这就使接口(HCI)或主控制器能在不影响传输层的基础上升级。
如图3所示,在HCI传输层中至少传送4种不同类型的包——HCI命令、HCI事件、ACL数据和SCL数据。每个HCI包都以HCI指示头开始,不同的指示头代表着不同类型的HCI包: 0x01HCI指令分组 0x02HCIACL数据分组 0x03HCISCO数据分组 0x04HCI事件分组
传输层主要有下列3种:HCIUSB;HCIPCM;HCIUART。我们用单片机通过HCI-UART传输子层对蓝牙模块进行控制。连接的原理图如图4所示:
图4 单片机与蓝牙连接原理图
一般来说,将单片机与蓝牙芯片在短距离内直接相连,便已可保证数据的可靠传输,也无须接CTS和RTS信号进行流量控制。单片机与蓝牙间的UART通信采用8位数据位,1位终止位,无奇偶校验,使用无类型小Endian格式,即最低位最先发送。UART通信格式及波特率均可通过单片机向蓝牙发送HCI指令来进行调整。ROK-101-008芯片最高可支持460.8Kbps的UART速率。发送给蓝牙模块的第一条HCI指令应该是软件复位(SoftReset)命令,当蓝牙执行完一条指令后,将返回一个带有状态参数信息的命令完成事件(Command_Complete_Event),以告知主机(单片机)命令执行的情况。
当完成软件复位后,要使得蓝牙模块做为从设备等待来自其他蓝牙设备的查询和连接发起,我们还需设置一些计时器的值,进行一系列的参数设定。即使是作为主设备的主机端蓝牙,在进行查询和建立连接之前也需要做上述的参数设定工作。这些需要设置的参数主要有下列几个: *SetEventFilter(设置事件过滤器) *WriteScanEnable(设置扫描参数,如是否可以进行查询和寻呼) *WriteAuthenticationEnable(设置是否需要进行验证) *WritePageTimeout(设置寻呼超时,一般该值可以设为7s)
打印机端的蓝牙模块在设置完上述各参数后便已经做好了从设备的准备,等待连接的建立。而在主机端的蓝牙模块还需进行查询(Inquiry)过程以取得远端设备的蓝牙地址,并根据查询得到的蓝牙地址来发起连接。一旦蓝牙连接被建立之后,便可以进行数据的收发,以实现蓝牙无线打印。
单片机与主机以及打印机的连接
单片机和主机以及打印机的接口电路十分简单,以与打印机连接为例,电路如图5所示:
图5 单片机与打印机连接原理图
将89C2051的P1口直接与打印机的数据口相连,用P3.7来采样打印机的BUSY信号。
由于主机与打印机的连线一般较长,打印机一侧一般均有匹配电阻,因此作为STROBE信号输出的P3.3不能与打印机直接相连,这里我们用一与非门来增加驱动能力以实现控制。当单片机接收到主机通过蓝牙发送过来的数据后,在打印机侧模拟主机对打印机进行控制操作。首先将要发送给打印机的数据从P1口输出,随后从P3.3经过门电路反向产生一个负脉冲,作为选通信号发送给打印机,侦听P3.7上的BUSY信号,当该信号电平为低时,则表示本次数据已被打印机接收,可以发送下一个数据。
以上方案并不涉及打印机的具体型号,也无须改变用户打印机的驱动程序,因而适用于大多数的通用打印机。这种用单片机通过UART传输层对蓝牙模块进行控制的方法,不仅仅适用于蓝牙打印机的研制,还适应于各类嵌入式的蓝牙系统。