蓝牙命令



1. 向蓝牙设备发送命令



bccmd -t bcsp -d /dev/ttymxc1 psload -r /etc/bluetooth/BC6QFN.psr



-t 指定通讯协议 bcsp 为蓝牙核心串口协议



-d 指定执行命令的特定设备



psload -r 装载psr文件中的所有ps键值, -r 表示加载后,发送一个热启动命令.






2. 蓝牙配置命令



hciattach -n /dev/ttymxc1 any 3000000



此篇文章用于说明如何在WinCE系统上实现串口蓝牙,希望给想在CE上实现这个功能的“新手”朋友一个帮助。
先说一下我的硬件环境:CSR BC4 ROM蓝牙芯片,S3C6410,WinCE6.0系统。
硬件连接:把蓝牙的RX,TX,CTS,RTS和板子上的相应口连接,注意是交叉连接,我这里连接的是UART1。还有就是给蓝牙供电,地,天线等。
硬件连接好之后,给蓝牙上电,先来搜一把?我当初就是这么干的,我的目的是想验证一下蓝牙有没有接好之类的,掏出手机一搜,结果什么也没有搜到,当时我很郁闷,但是今天回头来想想,认为当时什么也没搜到才算是正常的,如果当时能搜到这个蓝牙,那么,估计这个蓝牙在系统上也不会被认到了(指的是想在系统的控制面板里面,使用CE自带的蓝牙进行搜索配对等操作)。
好了,现在也搜不到蓝牙,也不能验证模组有没有接好,还是不管那么多了,下面开始上软件,用软件来验证。首先来实现让系统认到这个硬件(使用CE自带的程序进行搜索配对等)。
1、请先到​​javascript:void(0)​​这里下载蓝牙驱动,这个驱动编译后会生成一个bthbcsp.dll的文件。
2、把该驱动加到你的BSP包里面,便于编译。
3、在Platform.reg文件中添加如下的注册表项目:
[HKEY_LOCAL_MACHINE/Software/Microsoft/Bluetooth/Transports/BuiltIn/1]
"driver"="Bthbcsp.dll"
"flags"=dword:4
"name"="COM2:"
"baud"=dword:1C200
"FlashChip"=dword:0
"Priority256"=dword:84
"PacketSize"=dword:C0
"SerialTimeoutConstant"=dword:5
"SerialIntervelTimeout"=dword:ffffffff
"ReopenDelay"=dword:64
"resetdelay"=dword:1388 这里最关键的就是
"name"="COM2:"
"baud"=dword:1C200 两项,"name"="COM2:"这个是到时候驱动会使用这个名字的串口和蓝牙硬件通信,结合前面我的硬件连接,我的硬件是连接在UART1上,所以,我的系统中有把UART1这个串口设定为“COM2“,当然,这个名字是可以改的,但是必须要保证这里的,"name"=?这个的名字要和你连接的UART上映射的串口名字一样就可以。
"baud"=dword:1C200,这个很明显是在指定串口的波特率,十六进制表示,我这里设定的是115200,设定这个波特率的原因是,我蓝牙模块的默认波特率是115200,也就是说,这里设定的波特率应该要和你的蓝牙模块的默认波特率一样。原因是:驱动在加载的时候,首先会使用这里设定的波特率打开串口,和模块通信,此时,驱动会给模块进行初始化操作,会使用到一系列的PSKey值。模块只有在经过了这个初始化操作之后,才会开始工作。当然可以再这个PSKey的设置中更改模块的波特率,这样就可以提高蓝牙的传送速度等,关于这点我讲在后面来讲述,首先还是把这个波特率设定为你的蓝牙模块的默认波特率。
4、在Platform.bib文件中加入类似:
bthbcsp.dll $(_FLATRELEASEDIR)/bthbcsp.dll NK SHK
PSConfig.psr $(_FLATRELEASEDIR)/PSConfig.psr NK U
这样的信息。
5、添加组件,这里,使用系统在创建工程时候默认添加的组件即可:
a、core os->cebase->communication service and networking->networking-personal area network(PAN)->bluetooth->Bluetooth profiles support->Bluetooth HS/HF and Audio Gateway
b、core os->cebase->communication service and networking->networking-personal area network(PAN)->bluetooth->Bluetooth Protocol Stack with Transport Driver Support->Bluetooth Stack with Universal Loadable Driver
注意:在b这个同级目录下的组件,只添加这一个,其它的请不要添加。
6、编译系统,下载NK,如果不出意外,那么此时你就可以再系统的控制面板中搜索和配对蓝牙了。
如果运气不好,没反应,那么可以从以下几个方面着手查找,先确认相应的DLL和注册表文件是否有加入到系统中。查找驱动是否有加载(bthbcsp.dll)正常情况下,次驱动被加载,会跑到HCI_BCSP.cpp文件的HCI_OpenConnection函数中去,所以可以再这个函数中加上打印看看,是否有跑进来。如果跑进来了,而没有成功,那么请跟进看看跑到哪里就失败退出了之类的,以我的板子上为例,我的在打开串口后进行串口配置的时候就有个地方失败了,所以我在提供的驱动中也是屏蔽了这里的,具体的位置在HCI_BCSP.cpp文件的OpenConnection函数中:
#if 0
if (!SetupComm (serialPortHandle, serialBufferSize, serialBufferSize))
{
RETAILMSG(1, (TEXT("SetupComm/r/n")));
IFDBG(DebugOut(DEBUG_BCSP_ERROR, TEXT("<BcspCommunication::OpenConnection@%s> UNABLE TO SET BUFFERS"), name));
return GetLastError();
}
#endif 这里可以根据你的具体情况放开试试。
另外提醒一下:请在每次重启系统前的时候,最好给模块进行重新上电的操作!!!

如果顺利的话,此时,你已经可以搜索配对了,但这还不够,我们还需要传送文件看看,这个需要加入OBEX组件:
Core OS->CEBASE->Applications and Services Development->Object Exchange Protocol(OBEX)
依次展开这个目录下的所有子项,并添加它们。 添加后编译NK就可以传送文件了。
如果,在这里你出现了这样的现象,就是当下载完NK之后的第一次系统启动后,可以传送文件,一切都很正常,但是当重启之后,就不能传送文件了,在手机端老是提示连接失败,那么可以尝试在Platform.reg文件中加入如下注册表信息尝试:
[HKEY_LOCAL_MACHINE/Services/OBEX]
"FriendlyName"="OBEX"
"DLL"="OBEXSrVr.dll"
"Keep"=dword:1
; "Order"=dword:9
"Order"=dword:A
"Prefix"="OBX"
"Index"=dword:0这里是把OBEX这个驱动的启动顺序靠后了。
另外:
[HKEY_LOCAL_MACHINE/Software/Microsoft/Obex/Services/{00000000-0000-0000-0000-000000000000}]
;"BaseDir"="//My Documents//DefaultInbox"
"BaseDir"="//NandFlash//DefaultInbox"
"Server"="obexinbx.dll"这段信息可以设定保存文件时候的默认路径。

如果一切顺利,到这里你已经可以随心所欲的传送文件了,但是,可能此时你会觉得传送的速度太慢了,要提高传送的速度就需要设定更高的通信波特率。这里需要涉及到修改2个地方,一个是PSConfig.psr文件,这个文件是一个配置文件,用于来初始化蓝牙芯片。打开这个文件,里面有一些地址和值的配置,这里只需要修改波特率这一项即可:&01be=01d8,后面的01d8表示速度(默认的115200,和我的蓝牙模块的默认波特率一样),修改这个为你想要速度即可,注意这个的速度的修改应该参考一下的公式来进行换算:
修改完这个地方,还需要修改驱动中的打开串口的波特率。在HCI_BCSP.cpp文件中,HCI_OpenConnection函数中,有:
result = bcspCommunication.OpenConnection(szComPortName, dwBaud, dwDefaultPacketSize, dwThreadPriority, TRUE);
把这里的dwBaud参数,修改为你在上面PSCONfig.psr文件中设定的波特率一样的即可。此时还应该在OpenConnection函数中开启硬件控制(波特率太高的情况下)。
修改这2个地方之后,重新编译,下载NK,注意这里在下载NK的时候,一定要做到给蓝牙复位,或重新上电。否则,你会发现连接不上蓝牙了。
如果你的串口驱动足够OK的话,那么此时你的速度应该会提升到你设定的(串口速度/8/2)K/s,很遗憾的是我的速度并没有提升,估计是我的串口驱动不够强,没有使用上硬件控制流的功能.....

至此,完成了一个最基本的文件传送的蓝牙的设置,如果希望两个蓝牙之间使用文本数据的方式来通信,可以采用Socket的方式来进行,在下载的文件中有2个别人写的示例程序(在此感谢原作者),一个是CE上的Socket方式的通信,一个是PC上的蓝牙程序。另外,在PC上进行蓝牙的Socket开发的时候,你可能还需要先安装一个XP SP2的SDK,然后才可以进行开发。
Baud rate = pskey_value/0.004096
这里还列有一些典型的速度值:

38k4 baud - 157 (0x009d)
57k6 baud - 236 (0x00ec)
115k2 baud - 472 (0x01d8)
230k4 baud - 944 (0x03b0)
460k8 baud - 1887 (0x075f)
921k6 baud - 3775 (0x0ebf)
1382k4 baud - 5662 (0x161e)

WINCE5.O对USB蓝牙适配器服务的支持
<1>添加蓝牙协议栈
蓝牙组件位置:Communication Services and Networking/Networking - Personal Area Network (PAN)/Bluetooth/
Bluetooth Protocol Stack with Transport Driver Support/Bluetooth Stack with Integrated USB Driver
Bluetooth Protocol Stack with Transport Driver Support/Bluetooth Stack with Universal Loadable Driver
Bluetooth Profiles Support/Bluetooth DUN Gateway
Bluetooth Profiles Support/Bluetooth HS/HF and Audio Gateway Service
Bluetooth Profiles Support/Bluetooth LAP and Configuration Utility
Bluetooth Profiles Support/Bluetooth PAN
<2>添加对象交换协议
Applications and Services Development/OBEX Client
Applications and Services Development/OBEX Server/OBEX File Browser
Applications and Services Development/OBEX Server/OBEX Inbox
<3>修改注册表
修改注册表文件内容:C:/WINCE500/PUBLIC/SERVERS/OAK/FILES/servers.reg
查找下面内容,并添加
"CanWrite" = dword:1
"Authenticate" = dword:0
"Password" = "0000 "
"Transport Authenticate"=dword:0
修改前:
; @CESYSGEN IF SERVERS_MODULES_OBEXFILE
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Obex/Services/{f9ec7bc4-953c-11d2-984e-525400dc9e09}]
"BaseDir"="//Temp//Ftp"
"Server"="obexfile.dll"
; @CESYSGEN IF CE_MODULES_BTD
"BluetoothSdpRecord"=hex:35,41,09,00,01,35,03,19,11,06,09,00,04,35,11,35,/
03,19,01,00,35,05,19,00,03,08,0a,35,03,19,00,08,/
09,00,06,35,09,09,65,6e,09,00,6a,09,01,00,09,00,/
09,35,08,35,06,19,11,06,09,01,00,09,01,00,25,03,/
46,54,50
; @CESYSGEN ENDIF CE_MODULES_BTD
; @CESYSGEN ENDIF SERVERS_MODULES_OBEXFILE
; @CESYSGEN IF SERVERS_MODULES_OBEXEXEC
;[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Obex/Services/{f9ec7bc4-953c-11d2-984e-525400dc9e09}]
; "Server"="obexexec.dll"
; @CESYSGEN ENDIF SERVERS_MODULES_OBEXEXEC
修改后:
; @CESYSGEN IF SERVERS_MODULES_OBEXFILE
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Obex/Services/{f9ec7bc4-953c-11d2-984e-525400dc9e09}]
"BaseDir"="//Temp//Ftp"
"Server"="obexfile.dll"
; @CESYSGEN IF CE_MODULES_BTD
"BluetoothSdpRecord"=hex:35,41,09,00,01,35,03,19,11,06,09,00,04,35,11,35,/
03,19,01,00,35,05,19,00,03,08,0a,35,03,19,00,08,/
09,00,06,35,09,09,65,6e,09,00,6a,09,01,00,09,00,/
09,35,08,35,06,19,11,06,09,01,00,09,01,00,25,03,/
46,54,50
;下面要添加的
"CanWrite" = dword:1
"Authenticate" = dword:0
"Password" = "0000 "
"Transport Authenticate"=dword:0
; @CESYSGEN ENDIF CE_MODULES_BTD
; @CESYSGEN ENDIF SERVERS_MODULES_OBEXFILE
<4>重新编译工程