? ? ? ? 需要输入配对码进行配对,并且要配对成功,连接成功,之后Windows系统会自动分配一个COM端口给该蓝牙设备使用,是长期预留的那种端口,长期预留给该设备。
? ? ? ? 也就是是说,若干年以后,如果蓝牙设备启动并连接到电脑,这个设备占用的端口依然还是当初那个端口。形如:“COM3”、“COM4”、“COM5”。。。。。。
? ? ? ? ?我用的是比较旧版本的设备,用的就是这种方式了,新版本应该也是大差不差。
? ? ? ? 据说:HC-05 通常是指一个能够作为主机或从机工作的全功能蓝牙模块,而它的亲戚型号 HC-06 主要用作从机。
using System.Collections;
using System.Collections.Generic;
using System.IO.Ports;
using System.Threading;
using UnityEngine;
using TMPro;
using System;
using UnityEngine.UI;
using System.Drawing.Printing;
public class COMPortFinderX : MonoBehaviour
? ? ? ? 指定端口号或者遍历端口号,使用字符类型即可,
? ? ? ? 例如,你可以指定 portName == "COM3"
private string portName;
? ? ? ??声明了一个SerialPort
类型的私有变量serialPort
。SerialPort
类在.NET中用于表示一个串行端口,可以用于串行通信。
? ? ? ??声明了一个Thread
类型的私有变量readThread
。Thread
类在.NET中用于表示一个线程,可以用于并行或后台执行任务。
? ? ? ??声明了一个int
类型的私有变量baudRate
,并将其初始化为9600。波特率(baud rate)是串行通信中的一个参数,表示每秒传输的符号(或比特)数量。9600是一个常见的波特率值。
private SerialPort serialPort;
private Thread readThread;
private int baudRate = 9600;
? ? ? ? 注意,这里我打开了串口之后,测试完之后没有去关闭串口,在其他地方最终才关闭了串口,小伙伴记得注意打开串口之后要记得关闭串口哦,不然有可能会给项目的开发和测试造成干扰。
? ? ? ? 在.NET的SerialPort
类中,CtsHolding
属性表示清除发送(Clear-to-Send,CTS)信号的状态。CTS是硬件流控制的一部分,用于在串行通信中协调数据的发送。
? ? ? ? 当CtsHolding
为true
时,表示CTS信号是活动的,串行设备可以发送数据。当CtsHolding
为false
时,表示CTS信号是非活动的,串行设备应该停止发送数据。
? ? ? ? 我使用的蓝牙手柄是支持发送数据的,如果不支持发送数据,或者某个端口是不支持发送数据的,那就不是我的蓝牙手柄,那就不是我想要的串口,那就可以PASS掉了。
try
{
serialPort = new SerialPort(portName, baudRate);
serialPort.ReadTimeout = 2000;
serialPort.Open();
if (serialPort.CtsHolding && CheckSerialData())
{
efficient= true;
}
else
{
invalid = true;
}
}
catch (System.Exception e)
{
string getE = e.ToString();
invalid = true;
}
done = true;
? ? ? ? 这里的判断我是根据数据按照自己的格式切分后的长度来判断是否蓝牙手柄
? ? ? ? 如果切分后的长度大于等于1,那就是我想要的蓝牙手柄
? ? ? ? 小伙伴们可以根据自己的项目需求来自定义自己的判断逻辑
try
{
bool IsHC;
string receivedData = serialPort.ReadLine();
if (receivedData != null)
{
string[] values = receivedData.Split(',');
if (values.Length >= 1)
{
IsHC = true;
}
else
{
IsHC = false;
}
serialPort.Close();
return IsHC;
}
else
{
IsHC = false;
serialPort.Close();
return IsHC;
}
}
catch (System.Exception e)
{
bool IsHC = false;
serialPort.Close();
return IsHC;
}
? ? ? ? 通过多层次的判断,最终就能得到自己的蓝牙设备的端口号了,这个端口号一般情况来说(不去刻意修改的情况下)是长期有效的,配对的时候是什么端口号,以后基本上还会是什么端口号,这个端口号就代表某个蓝牙设备。
? ? ? ? 即使不放心,可以写一个自定义的程序,在每次使用蓝牙设备之前,重新识别和绑定一下自己的设备端口号,这种方法就十分稳妥。
? ? ? ? 至此,既然得到了端口号,每次在Untiy游戏中需要的时候,连接这个端口,就可以让Unity与蓝牙设备交互了。
serialPort = new SerialPort(portName, baudRate);
serialPort.ReadTimeout = 2000;
serialPort.Open();
string receivedData = serialPort.ReadLine();
serialPort.Close();
? ? ? ? 甚至是(因为我用的是子线程来连接串口):
readThread.Abort();