winform笔记本蓝牙与外部蓝牙设备通信
转自:https://www.cnblogs.com/zjutlitao/p/3886826.html
一、蓝牙模块XLBT232‐D01介绍(外部设备蓝牙)
1.1、蓝牙模块简介
XLBT232-D0101蓝牙模块采用CSR BlueCore 芯片,配置6-8Mbit 的软件存储空间,
支持AT 指令,用户可根据需要更改SPP 角色(主、从模式)以及串口波特率、
设备名称、配对密码等参数,使用灵活。
1.2、模块功能介绍
1.2.1、特性
- 蓝牙协议:Bluetooth Specification V2.1+EDR、V2.0+EDR、V2.1、V2.0 V1.2
- 工作频率:2.4GHz ISM band
- 调制方式:GFSK(Gaussian Frequency Shift Keying)
- 发射 率:≤4dBm, Class 2
- 灵 敏 度:≤-84dBm at 0.1% BER
- 传输速率:Asynchronous: 2.1Mbps(Max) / 160 kbpsSynchronous: 1Mbps/1Mbps
- 安全特性:Authentication and encryption
- 支持服务:Bluetooth SPP(主模式& 从模式)
- 供电电源:+3.3VDC 50mA
- 工作温度:-5 ~ +65 Centigrade
- 外观尺寸:26.9mm x 13mm x 2.2 mm
1.2.2、模块接线原理图
PS:当然也能用USB转TTL模块进行连接在电脑上调试,毕竟大多数笔记本已经没有串口啦!
1.3、使用说明
[图:蓝牙模块]
>_<" KEY为输入管脚,短按控制,或者输入约100ms 的高电平单次脉冲,可以
实现以下功能:
- 模块设置为SPP 主机模式时:
未连接状态时:清除配对信息(若存在配对设备信息)
已连接状态时:主动发起断开连接,延时150ms 后重启,重新搜索
连接从设备; 在断开连接时:重新搜索连接从设备。
- 模块设置为SPP 从机时:
在已连接状态时:主动发起断开连接,延时150ms 后重启,重新进入被搜
索状态,等待主机配对和连接
在断开连接时:延时150ms 后重启,重新进入被搜索状态,等待主机配对
和连接。
>_<" 显示模块当前工作状态:
- 待机状态慢闪——重复2s 脉冲;
- 连接状态长亮——高电平。
1.4、AT指令集
蓝牙模块出厂默认的串口配置为:波特率9600,无校验,数据位8,停止位1。
PS:接下来说明以上位机为电脑,模块参数为出厂设置时进行配置说明。
>_<" 将模块通过USB电平转换板连接到电脑USB口(USB转TTL),使用串口调试助手,按
照 9600,N,8,1 进行配置,打开串口后,发送 AT(无\r\n),若返回 OK,说明配置
成功。
PS:设置 AT 指令必须在蓝牙模块未连接或断开 SPP 链接时才可以(上电或配对
后都可以,如果连接 SPP,串口输入的数据将会直接发送到远端蓝牙设备串口)
1.4.1、测试指令:
1.4.2、查询\设置波特率指令:
1.4.3、查询\设置设备名称指令:
1.4.4、恢复默认设置指令:
1.4.5、模块复位\重启指令:
1.4.6、查询\设置主从模式:
1.4.7、查询\设置配对密码:
1.4.8、查询\设置是否需要密码鉴权:
PS:为方便使用,默认为不用密码鉴权连接,搜索到蓝牙串口之后,直接连接
可。有安全考虑的客户请选择需要密码鉴权。
PS:此指令只有在从设备时才有效;主设备时不接受此指令,发送此指令没
有回复,也不执行
1.4.9、清除主设备配对信息指令:
PS:此指令只有在主设备时才有效;从设备时不接受此指令,发送此指令
没有回复,也不执行。
1.4.10、搜索并连接新的蓝牙串口从设备(*)指令:
PS:此指令只有在主设备时才有效;从设备时不接受此指令,发送此指令没
有回复,也不执行。
1.4.11、连接最后一次连接的蓝牙串口从设备(*)指令:
PS:此指令只有在主设备时才有效;从设备时不接受此指令,发送此指令没
有回复,也不执行。
1.4.12、连接指定蓝牙地址的从设备(*)指令:
PS:此指令只有在主设备时才有效;从设备时不接受此指令,发送此指令没
有回复,也不执行。
1.4.13、查询、设置软件版本指令:
1.4.14、系统帮助指令:
1.4.15、查询本机MAC 地址指令:
>_<: 1:所有参数设置后存储在模块内,下次启动时无需再次设置
2:AT 指令后标注*号的,表示目前未应用的AT 指令
二、蓝牙模块配置与笔记本电脑相连
2.1.1、蓝牙初始化配置:
将蓝牙模块通过TTL转USB模块连接到笔记本,打开串口助手,通过上述AT指令设置为从设备,波特率为9600,然后重启
[图:USB转TTL模块]
[图:串口助手]
2.1.2、电脑为主设备搜索建立连接:
点击笔记本蓝牙标志的小图标,添加蓝牙设备:
然后要等一会,笔记本正在装驱动:
然后右击蓝牙图标,查看蓝牙设备,可见我们的设备已经被电脑发现并添加:
查看该设备属性,此时笔记本为该设备提供一个串口,就是笔记本蓝牙和设备蓝牙通信的通道,要记住这个一会编程的时候会用到:
PS:这个COM15也可以在设备管理器中修改为其他通道
三、C#编程使笔记本蓝牙和外部设备蓝牙通信:
其实配对以后,蓝牙就被模拟成了一个端口,我们可以用最简单的端口通讯来收发信息。首先,在每次启动时,需要连接端口:
[FORM初始化时获取所有的COM口,并加入下拉列表]
1 public Form1() 2 { 3 InitializeComponent(); 4 5 //Get all port list for selection 6 //获得所有的端口列表,并显示在列表内 7 PortList.Items.Clear(); 8 string[] Ports = SerialPort.GetPortNames(); 9 10 for (int i = 0; i < Ports.Length; i++) 11 { 12 string s = Ports[i].ToUpper(); 13 Regex reg = new Regex("[^COM\\d]", RegexOptions.IgnoreCase | RegexOptions.Multiline); 14 s = reg.Replace(s, ""); 15 16 PortList.Items.Add(s); 17 } 18 if (Ports.Length > 1) PortList.SelectedIndex = 1; 19 }
[连接按钮事件:选中list中的被选中的COM口进行连接,如果连接成功就在状态栏显示蓝牙连接成功]
1 private void ConnectButton_Click(object sender, EventArgs e) 2 { 3 if (!BluetoothConnection.IsOpen) 4 { 5 //Start 6 Status = "正在连接蓝牙设备"; 7 BluetoothConnection = new SerialPort(); 8 ConnectButton.Enabled = false; 9 BluetoothConnection.PortName = PortList.SelectedItem.ToString(); 10 BluetoothConnection.Open(); 11 BluetoothConnection.ReadTimeout = 10000; 12 BluetoothConnection.DataReceived += new SerialDataReceivedEventHandler(BlueToothDataReceived); 13 Status = "蓝牙连接成功"; 14 } 15 }
[蓝牙接收数据事件响应函数,在按钮连接事件中声明的该事件,用于响应蓝牙数据接收]
1 private void BlueToothDataReceived(object o, SerialDataReceivedEventArgs e) 2 { 3 //int length = BluetoothConnection.ReadByte(); 4 Thread.Sleep(1000); 5 int length = 13; 6 BlueToothReceivedData = DateTime.Now.ToLongTimeString() + "\r\n"; 7 BlueToothReceivedData += "收到字节数:" + length + "\r\n"; 8 9 byte[] data = new byte[length]; 10 BluetoothConnection.Read(data,0,length); 11 for (int i = 0; i < length; i++) 12 { 13 BlueToothReceivedData += string.Format("data[{0}] = {1}\r\n", i, data[i]); 14 } 15 //receive close message 16 if (length == 3 && data[0] == 255 && data[1] == 255 && data[2] == 255) 17 { 18 //Stop 19 Status = "正在断开蓝牙设备"; 20 BluetoothConnection.Close(); 21 BluetoothConnection.Dispose(); 22 BluetoothConnection = null; 23 ConnectButton.Enabled = true; 24 Status = "蓝牙断开成功"; 25 } 26 }
- 这里第4行让程序休息1是因为延时等待从设备把数据发送完全。
- 这里为了方便我严格控制让发送数据为13Byte。
- 从设备发送的13Byte数据送至缓冲区,PC端C#程序通过read()函数将缓冲区数据接收到data中,下面是格式输出一下数据。
[发送数据函数]
1 private void BlueToothDataSend(byte[] data) 2 { 3 //int length = data.Length; 4 //byte[] readData = new byte[length + 2]; 5 //readData[0] = (byte)(length % 255); 6 //readData[1] = (byte)(length / 255); 7 //for (int i = 0; i < length; i++) 8 //{ 9 // readData[i + 2] = data[i]; 10 //} 11 //BluetoothConnection.Write(readData, 0, length + 2); 12 BluetoothConnection.Write(data, 0, 1); 13 //Status = "发送数据字节数:" + length; 14 }
- 本来是将data[]数据发送出去,因为我从设备设置为只要有数据发送过来就做出响应发送13Byte数据,所以就直接将data的第一byte发送出去了。
[定时器函数:用于刷新状态栏,和接收数据显示]
1 private void MonitorTimer_Tick(object sender, EventArgs e) 2 { 3 StatusMessage.Text = Status; 4 BlueToothMessage.Text = BlueToothReceivedData; 5 }
[发送数据按钮:将SendMessage中的数据获得发送出去]
1 private void SendButton_Click(object sender, EventArgs e) 2 { 3 byte n; 4 byte.TryParse(SendMessage.Text, out n); 5 6 BlueToothDataSend(new byte[] { n }); 7 }
四、PC和51单片机通过蓝牙连接展示
4.1.1、51单片机部分程序
一定要用11.0952Mhz的晶振,我用12Mhz结果出现帧丢失!其实这里采用的是52单片机,在此处区别不是很大~
将蓝牙模块的RXD连接单片机的RXD(P3.0),TXD连接单片机的TXD(P3.1),然后就像以前操作串口一样操作就行啦~
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
因为我还在P1.0和P1.1连接一个陀螺仪MPU6050所以上面的代码有点烦,其实可以参考一下我以前发的51单片机串口通信~
http://www.cnblogs.com/zjutlitao/p/3788696.htm
4.1.2、没有51单片机的情况
可以将蓝牙模块连接在USB转TTL上,用串口助手和你写的C#程序相互通信。
4.1.3、运行C#程序进行连接通信
[选择刚才的那个蓝牙端口点击连接]
[第一次蓝牙图标会给出一个验证提示:在验证框内输入AT指令配置时的你设置的验证码]
[然后就可以通信啦,如下:]
PS:相关代码及资料
C#蓝牙工程代码:http://pan.baidu.com/s/1hqHwG4W
51蓝牙工程代码:http://pan.baidu.com/s/1dDqywVZ
蓝牙模块说明书:http://pan.baidu.com/s/1kT61nx1
C#蓝牙相关博客链接:http://www.diy-robots.com/?p=410%20%E8%93%9D%E7%89%99