zoukankan      html  css  js  c++  java
  • WinCE串口蓝牙的实现 .

    此篇文章用于说明如何在WinCE系统上实现串口蓝牙,希望给想在CE上实现这个功能的“新手”朋友一个帮助。

        先说一下我的硬件环境: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)

     

  • 相关阅读:
    DevOps、CI、CD都是什么鬼?
    卧槽!华为《Linux中文手册》火了,完整版 PDF 开放下载!
    MongoDB 常用运维实践总结
    谈谈变更过程中的运维意识
    Ping原理详解
    为什么Redis要比Memcached更火?
    一篇文章教你搞懂日志采集利器 Filebeat
    工程师姓什么很重要!别再叫我“X工”!!!
    这些 Shell 分析服务器日志命令集锦,收藏好
    Linux下找出吃内存的方法总结
  • 原文地址:https://www.cnblogs.com/liang123/p/6325667.html
Copyright © 2011-2022 走看看