Unity连接蓝牙设备的其中一种方法(不一定通用,但思路也许可以)

发布时间:2024年01月04日

1. 先让蓝牙设备与Windows系统进行蓝牙配对

? ? ? ? 需要输入配对码进行配对,并且要配对成功,连接成功,之后Windows系统会自动分配一个COM端口给该蓝牙设备使用,是长期预留的那种端口,长期预留给该设备。

? ? ? ? 也就是是说,若干年以后,如果蓝牙设备启动并连接到电脑,这个设备占用的端口依然还是当初那个端口。形如:“COM3”、“COM4”、“COM5”。。。。。。

? ? ? ? ?我用的是比较旧版本的设备,用的就是这种方式了,新版本应该也是大差不差。

? ? ? ? ?首先,打开Windows的设置面板
? ? ? ? 接着,添加蓝牙设备

? ? ? ? 紧接着,确保先前已经开启了电脑的蓝牙功能,也确保蓝牙设备已经开启,连接需要连接的蓝牙设备,一般的蓝牙模块的默认名称是:HC-05

? ? ? ? 据说:HC-05 通常是指一个能够作为主机或从机工作的全功能蓝牙模块,而它的亲戚型号 HC-06 主要用作从机。

? ? ? ? 然后,应该是需要配对的pin码,一般默认的配对码是:1234
? ? ? ? 随后,一般就会配对成功,连接成功。
? ? ? ? 其次,打开设备管理器(Win + X + M),查看端口(COM和LPT),刚刚配对的蓝牙设备所占用的端口就是其中的一个或者两个,如果是占用了两个,很可能是一个用于从电脑输出数据到蓝牙设备,一个是用于从蓝牙向电脑输入数据。

? ? ? ? 最后,既然已经知道了端口范围,那就去检验哪一个是“真正的端口”就可以了。

2. 火眼金睛判别真正的蓝牙设备端口

? ? ? ? 可能用得到的命名空间
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;
? ? ? ? 我的方法的话,继承MonoBehaviour即可
public class COMPortFinderX : MonoBehaviour

? ? ? ? 指定端口号或者遍历端口号,使用字符类型即可,

? ? ? ? 例如,你可以指定 portName == "COM3"

private string portName;
? ? ? ? 初始化一些后续需要用的东西:

? ? ? ??声明了一个SerialPort类型的私有变量serialPortSerialPort类在.NET中用于表示一个串行端口,可以用于串行通信。

? ? ? ??声明了一个Thread类型的私有变量readThreadThread类在.NET中用于表示一个线程,可以用于并行或后台执行任务。

? ? ? ??声明了一个int类型的私有变量baudRate,并将其初始化为9600。波特率(baud rate)是串行通信中的一个参数,表示每秒传输的符号(或比特)数量。9600是一个常见的波特率值。

private SerialPort serialPort;
private Thread readThread;
private int baudRate = 9600;
? ? ? ? 顶层的判断(这里面有个CheckSerialData是我自己自定义的函数,底层的判断是CheckSerialData):

? ? ? ? 注意,这里我打开了串口之后,测试完之后没有去关闭串口,在其他地方最终才关闭了串口,小伙伴记得注意打开串口之后要记得关闭串口哦,不然有可能会给项目的开发和测试造成干扰。

? ? ? ? 在.NET的SerialPort类中,CtsHolding属性表示清除发送(Clear-to-Send,CTS)信号的状态。CTS是硬件流控制的一部分,用于在串行通信中协调数据的发送。

? ? ? ? 当CtsHoldingtrue时,表示CTS信号是活动的,串行设备可以发送数据。当CtsHoldingfalse时,表示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与蓝牙设备交互了。

总共5个步骤:

? ? ? ? 1. 指定端口号和波特率:

serialPort = new SerialPort(portName, baudRate);

? ? ? ? 2. 可以指定超时的时间,超时就是过了这个时间还连接不成功,那就不连接了,无效处理

serialPort.ReadTimeout = 2000;

? ? ? ? 3. 打开串口传输:

serialPort.Open();

? ? ? ? 4. 逐行读取串口数据:

string receivedData = serialPort.ReadLine();

? ? ? ? 5. 不用的时候,或者结束的时候,记得关闭串口哦

serialPort.Close();

? ? ? ? 甚至是(因为我用的是子线程来连接串口):

readThread.Abort();

文章来源:https://blog.csdn.net/weixin_47420447/article/details/135244162
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。