WinCE串口蓝牙的实现 .
先说一下我的硬件环境:CSR BC4 ROM蓝牙芯片,S3C6410,WinCE6.0系统。
硬件连接:把蓝牙的RX,TX,CTS,RTS和板子上的相应口连接,注意是交叉连接,我这里连接的是UART1。还有就是给蓝牙供电,地,天线等。
硬件连接好之后,给蓝牙上电,先来搜一把?我当初就是这么干的,我的目的是想验证一下蓝牙有没有接好之类的,掏出手机一搜,结果什么也没有搜到,当时我很郁闷,但是今天回头来想想,认为当时什么也没搜到才算是正常的,如果当时能搜到这个蓝牙,那么,估计这个蓝牙在系统上也不会被认到了(指的是想在系统的控制面板里面,使用CE自带的蓝牙进行搜索配对等操作)。
好了,现在也搜不到蓝牙,也不能验证模组有没有接好,还是不管那么多了,下面开始上软件,用软件来验证。首先来实现让系统认到这个硬件(使用CE自带的程序进行搜索配对等)。
1、请先到http://lailzhihou.download.csdn.net/这里下载蓝牙驱动,这个驱动编译后会生成一个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)