Windows Mobile 6.1通过蓝牙串口传输数据

来源:互联网 发布:淘宝联盟账户余额是0 编辑:程序博客网 时间:2024/05/15 23:52

在开发通过Mobile连接蓝牙串口传输GPS数据时遇到的问题记录一下。

一、蓝牙串口的建立
想在mobile平台上通过蓝牙串口发送数据,遇到过一些问题,在此记录一下,由于在mobile上无法像CE上直接通过代码操作蓝牙去查找设备,连接设备,在mobile上需要先在程序外面配对后建立发送端口,然后才能像操作串口那样去连接设备,接收数据。具体方法如下:
在【设置】-->【蓝牙】中添加新设备中搜索到需要连接的设备,下一步,输入密码进行配对,此时并未真正完成蓝牙的配对操作,切换到【COM端口标签页】,新建发送端口,给设备添加一下可用端口,经测试{com0,com5,com8,com9}可用,其它好像不能用,具体情况根据机器有可能不同。此时端口配对操作完成,在应用程序中选择新配置的COM口及波特率与设备进行连接。

二、端口号与设备的对应关系
以上动作完成后会有一个问题:当配对的机器多了之后根本无法知道哪个COM口对应的哪台设备,经过百般查找,后来意识到微软的东西几乎都是存在注册表里的,在设置里能看到对应关系,那么就自然可以将设备名称与端口号对应起来,不用每次都去设置里查看。具体办法如下:

在LOCAL_MACHINE\Software\Microsoft\Bluetooth\Device与LOCAL_MACHINE\Software\Microsoft\Bluetooth\Serial\Ports下存在一些注册表项,经过验证Ports下保存的为新建发送端口的设备,Device下保存的是配对成功但是没有新建发送端口的设备,现在的对应关系是在Ports里找到一个设备新建的端口号,再通过Device下去查找设备名,两者组合起来就完成了对应关系,注意:Device下的设备号比Ports下前面少4个0,后面的数字一样,这是对应关系的关键。代码(C#)如下:

private List<string> GetDevicePort()        {            RegistryKey key = null;            List<string> results = new List<string>();            try            {                key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Bluetooth\\Serial\\Ports", false);                if (key != null)                {                    string[] coms = key.GetSubKeyNames();//获取已配置设备MAC                    if (coms != null)                    {                        for (int i = 0; i < coms.Length; i++)                        {                            string result = string.Empty;                            //获取设备名[HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\Device\00025a0091d2]                            key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Bluetooth\\Device\\" + coms[i].Substring(4), false);                            if (key != null)                            {                                object deviceName = key.GetValue("name");                                if(deviceName!=null)                                {                                    result += deviceName.ToString().Trim('\0');                                }                            }                            //获取设备COM口                            key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Bluetooth\\Serial\\Ports\\" + coms[i], false);                            if (key != null)                            {                                object comNum = key.GetValue("Port");                                if (comNum != null)                                {                                    result+="("+comNum.ToString().Trim('\0')+")";                                }                            }                            results.Add(result);                        }                    }                }                return results;            }            finally            {                if (key != null)                    key.Close();            }        }
三、蓝牙的重启动这样在自己的应用程序中就可以清楚的看到哪个端口对应的哪台设备了。在Mobile设置连接蓝牙后异常断开会出现很难再连接的情况,目前我的解决办法如下:通过蓝牙API进行蓝牙的重启,经过测试效率较高:蓝牙有三种状态,PowerOff、Connectable、Discoverable; PowerOff为蓝牙电源关、Connectable为蓝牙可连接、Discoverable为蓝牙不可补发现当出现蓝牙无法连接时:首先调用BthSetMode(PowerOff)关闭蓝牙,然后调用BthSetMode(Connectable)开启蓝牙,这样成功率较高,注意开启后好像要等待几秒后才会生效。API如下(C#调用):
[DllImport("BthUtil.dll", SetLastError = true)]public static extern int BthSetMode(RadioMode dwMode);[DllImport("BthUtil.dll", SetLastError = true)]public static extern int BthGetMode(ref RadioMode dwMode);public enum RadioMode{    PowerOff = 0,    Connectable = 1,    Discoverable
<span style="font-family: Arial, Helvetica, sans-serif;">}</span>

0 0
原创粉丝点击