編程控制筆記本藍(lán)牙與外部藍(lán)牙設(shè)備通信
掃描二維碼
隨時(shí)隨地手機(jī)看文章
一、藍(lán)牙模塊XLBT232‐D01介紹(外部設(shè)備藍(lán)牙)
1.1、藍(lán)牙模塊簡(jiǎn)介
XLBT232-D0101藍(lán)牙模塊采用CSR BlueCore 芯片,配置6-8Mbit 的軟件存儲(chǔ)空間,
支持AT 指令,用戶可根據(jù)需要更改SPP 角色(主、從模式)以及串口波特率、
設(shè)備名稱、配對(duì)密碼等參數(shù),使用靈活。
1.2、模塊功能介紹
1.2.1、特性
藍(lán)牙協(xié)議:Bluetooth Specification V2.1+EDR、V2.0+EDR、V2.1、V2.0 V1.2
? 工作頻率:2.4GHz ISM band
? 調(diào)制方式:GFSK(Gaussian Frequency Shift Keying)
? 發(fā)射 率:≤4dBm, Class 2
? 靈 敏 度:≤-84dBm at 0.1% BER
? 傳輸速率:Asynchronous: 2.1Mbps(Max) / 160 kbpsSynchronous: 1Mbps/1Mbps
? 安全特性:Authentication and encryption
? 支持服務(wù):Bluetooth SPP(主模式& 從模式)
? 供電電源:+3.3VDC 50mA
? 工作溫度:-5 ~ +65 Centigrade
? 外觀尺寸:26.9mm x 13mm x 2.2 mm
1.2.2、模塊接線原理圖
PS:當(dāng)然也能用USB轉(zhuǎn)TTL模塊進(jìn)行連接在電腦上調(diào)試,畢竟大多數(shù)筆記本已經(jīng)沒有串口啦!
1.3、使用說明
[圖:藍(lán)牙模塊]
>_<"KEY為輸入管腳,短按控制,或者輸入約100ms 的高電平單次脈沖,可以
實(shí)現(xiàn)以下功能:
模塊設(shè)置為SPP 主機(jī)模式時(shí):
未連接狀態(tài)時(shí):清除配對(duì)信息(若存在配對(duì)設(shè)備信息)
已連接狀態(tài)時(shí):主動(dòng)發(fā)起斷開連接,延時(shí)150ms 后重啟,重新搜索
連接從設(shè)備; 在斷開連接時(shí):重新搜索連接從設(shè)備。
模塊設(shè)置為SPP 從機(jī)時(shí):
在已連接狀態(tài)時(shí):主動(dòng)發(fā)起斷開連接,延時(shí)150ms 后重啟,重新進(jìn)入被搜
索狀態(tài),等待主機(jī)配對(duì)和連接
在斷開連接時(shí):延時(shí)150ms 后重啟,重新進(jìn)入被搜索狀態(tài),等待主機(jī)配對(duì)
和連接。
>_<"顯示模塊當(dāng)前工作狀態(tài):
待機(jī)狀態(tài)慢閃——重復(fù)2s 脈沖;
連接狀態(tài)長(zhǎng)亮——高電平。
1.4、AT指令集
藍(lán)牙模塊出廠默認(rèn)的串口配置為:波特率9600,無校驗(yàn),數(shù)據(jù)位8,停止位1。
PS:接下來說明以上位機(jī)為電腦,模塊參數(shù)為出廠設(shè)置時(shí)進(jìn)行配置說明。
>_<"將模塊通過USB電平轉(zhuǎn)換板連接到電腦USB口(USB轉(zhuǎn)TTL),使用串口調(diào)試助手,按
照 9600,N,8,1 進(jìn)行配置,打開串口后,發(fā)送 AT(無rn),若返回 OK,說明配置
成功。
PS:設(shè)置 AT 指令必須在藍(lán)牙模塊未連接或斷開 SPP 鏈接時(shí)才可以(上電或配對(duì)
后都可以,如果連接 SPP,串口輸入的數(shù)據(jù)將會(huì)直接發(fā)送到遠(yuǎn)端藍(lán)牙設(shè)備串口)
1.4.1、測(cè)試指令:
1.4.2、查詢?cè)O(shè)置波特率指令:
1.4.3、查詢?cè)O(shè)置設(shè)備名稱指令:
1.4.4、恢復(fù)默認(rèn)設(shè)置指令:
1.4.5、模塊復(fù)位重啟指令:
1.4.6、查詢?cè)O(shè)置主從模式:
1.4.7、查詢?cè)O(shè)置配對(duì)密碼:
1.4.8、查詢?cè)O(shè)置是否需要密碼鑒權(quán):
PS:為方便使用,默認(rèn)為不用密碼鑒權(quán)連接,搜索到藍(lán)牙串口之后,直接連接
可。有安全考慮的客戶請(qǐng)選擇需要密碼鑒權(quán)。
PS:此指令只有在從設(shè)備時(shí)才有效;主設(shè)備時(shí)不接受此指令,發(fā)送此指令沒
有回復(fù),也不執(zhí)行
1.4.9、清除主設(shè)備配對(duì)信息指令:
PS:此指令只有在主設(shè)備時(shí)才有效;從設(shè)備時(shí)不接受此指令,發(fā)送此指令
沒有回復(fù),也不執(zhí)行。
1.4.10、搜索并連接新的藍(lán)牙串口從設(shè)備(*)指令:
PS:此指令只有在主設(shè)備時(shí)才有效;從設(shè)備時(shí)不接受此指令,發(fā)送此指令沒
有回復(fù),也不執(zhí)行。
1.4.11、連接最后一次連接的藍(lán)牙串口從設(shè)備(*)指令:
PS:此指令只有在主設(shè)備時(shí)才有效;從設(shè)備時(shí)不接受此指令,發(fā)送此指令沒
有回復(fù),也不執(zhí)行。
1.4.12、連接指定藍(lán)牙地址的從設(shè)備(*)指令:
PS:此指令只有在主設(shè)備時(shí)才有效;從設(shè)備時(shí)不接受此指令,發(fā)送此指令沒
有回復(fù),也不執(zhí)行。
1.4.13、查詢、設(shè)置軟件版本指令:
1.4.14、系統(tǒng)幫助指令:
1.4.15、查詢本機(jī)MAC 地址指令:
>_<:1:所有參數(shù)設(shè)置后存儲(chǔ)在模塊內(nèi),下次啟動(dòng)時(shí)無需再次設(shè)置
2:AT 指令后標(biāo)注*號(hào)的,表示目前未應(yīng)用的AT 指令
二、藍(lán)牙模塊配置與筆記本電腦相連
2.1.1、藍(lán)牙初始化配置:
將藍(lán)牙模塊通過TTL轉(zhuǎn)USB模塊連接到筆記本,打開串口助手,通過上述AT指令設(shè)置為從設(shè)備,波特率為9600,然后重啟
[圖:USB轉(zhuǎn)TTL模塊]
[圖:串口助手]
2.1.2、電腦為主設(shè)備搜索建立連接:
點(diǎn)擊筆記本藍(lán)牙標(biāo)志的小圖標(biāo),添加藍(lán)牙設(shè)備:
然后要等一會(huì),筆記本正在裝驅(qū)動(dòng):
然后右擊藍(lán)牙圖標(biāo),查看藍(lán)牙設(shè)備,可見我們的設(shè)備已經(jīng)被電腦發(fā)現(xiàn)并添加:
查看該設(shè)備屬性,此時(shí)筆記本為該設(shè)備提供一個(gè)串口,就是筆記本藍(lán)牙和設(shè)備藍(lán)牙通信的通道,要記住這個(gè)一會(huì)編程的時(shí)候會(huì)用到:
PS:這個(gè)COM15也可以在設(shè)備管理器中修改為其他通道
三、C#編程使筆記本藍(lán)牙和外部設(shè)備藍(lán)牙通信:
其實(shí)配對(duì)以后,藍(lán)牙就被模擬成了一個(gè)端口,我們可以用最簡(jiǎn)單的端口通訊來收發(fā)信息。首先,在每次啟動(dòng)時(shí),需要連接端口:
[FORM初始化時(shí)獲取所有的COM口,并加入下拉列表]
1 public Form1()
2 {
3 InitializeComponent();
4
5 //Get all port list for selection
6 //獲得所有的端口列表,并顯示在列表內(nèi)
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 }
[連接按鈕事件:選中l(wèi)ist中的被選中的COM口進(jìn)行連接,如果連接成功就在狀態(tài)欄顯示藍(lán)牙連接成功]
1 private void ConnectButton_Click(object sender, EventArgs e)
2 {
3 if (!BluetoothConnection.IsOpen)
4 {
5 //Start
6 Status = "正在連接藍(lán)牙設(shè)備";
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 = "藍(lán)牙連接成功";
14 }
15 }
[藍(lán)牙接收數(shù)據(jù)事件響應(yīng)函數(shù),在按鈕連接事件中聲明的該事件,用于響應(yīng)藍(lán)牙數(shù)據(jù)接收]
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() + "rn";
7 BlueToothReceivedData += "收到字節(jié)數(shù):" + length + "rn";
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}rn", 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 = "正在斷開藍(lán)牙設(shè)備";
20 BluetoothConnection.Close();
21 BluetoothConnection.Dispose();
22 BluetoothConnection = null;
23 ConnectButton.Enabled = true;
24 Status = "藍(lán)牙斷開成功";
25 }
26 }
這里第4行讓程序休息1是因?yàn)檠訒r(shí)等待從設(shè)備把數(shù)據(jù)發(fā)送完全。
這里為了方便我嚴(yán)格控制讓發(fā)送數(shù)據(jù)為13Byte。
從設(shè)備發(fā)送的13Byte數(shù)據(jù)送至緩沖區(qū),PC端C#程序通過read()函數(shù)將緩沖區(qū)數(shù)據(jù)接收到data中,下面是格式輸出一下數(shù)據(jù)。
[發(fā)送數(shù)據(jù)函數(shù)]
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 = "發(fā)送數(shù)據(jù)字節(jié)數(shù):" + length;
14 }
本來是將data[]數(shù)據(jù)發(fā)送出去,因?yàn)槲覐脑O(shè)備設(shè)置為只要有數(shù)據(jù)發(fā)送過來就做出響應(yīng)發(fā)送13Byte數(shù)據(jù),所以就直接將data的第一byte發(fā)送出去了。
[定時(shí)器函數(shù):用于刷新狀態(tài)欄,和接收數(shù)據(jù)顯示]
1 private void MonitorTimer_Tick(object sender, EventArgs e)
2 {
3 StatusMessage.Text = Status;
4