基于C#的蓝牙串口模块上位机开发

一、说明

本文章讨论使用C#,使个人主机与蓝牙串口模块进行通信。

  • 硬件准备:

    • 蓝牙串口模块(本次使用HC-04)
    • CH340(USB转TTL)
  • 软件准备:

    • Visual Studio(安装C#.NET Framework框架)
    • 串口调试助手(微软商店可下载)
  • 操作系统:win10

  • 功能:通过上位机向蓝牙模块发送数据

  • 蓝牙协议:BLE4.0

二、创建工程

选择C# 控制台应用(.NET Framework)
创建工程
创建工程

三、安装依赖包

使用VS自带的NuGet下载
工具->NuGet包管理器->管理解决方案的NuGet程序包
添加依赖
这里有一个坑,添加的包不是InTheHand.NET.Bluetooth,而是32feet.NET
添加依赖

四、编写程序

1.命名空间

1
2
3
4
using InTheHand.Net;
using InTheHand.Net.Bluetooth;
using InTheHand.Net.Sockets;
using System.IO;

2.搜索蓝牙设备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool isFound = false;//是否搜寻到蓝牙
BluetoothClient client = new BluetoothClient(); //处理蓝牙的对象
BluetoothRadio radio = BluetoothRadio.PrimaryRadio; //获取电脑蓝牙
radio.Mode = RadioMode.Connectable; //设置电脑蓝牙可被搜索到
BluetoothAddress blueAddress = new BluetoothAddress(new byte[]//需要连接的蓝牙模块的唯一标识符
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });//要赋初值,不然会报错
BluetoothDeviceInfo[] devices = client.DiscoverDevices(); //搜索蓝牙设备,10秒

foreach (var item in devices)
{
if (item.DeviceName.Equals("HC-04")) //根据蓝牙名字找
{
Console.WriteLine(item.DeviceAddress);
Console.WriteLine(item.DeviceName);
blueAddress = item.DeviceAddress; //获得蓝牙模块的唯一标识符
isFound = true;
break;
}
}
  • 蓝牙设备的标识符格式:
    与MAC地址类似,由6个字节组成,例如
    04-21-11-29-01-D8
  • 数组中存放标识符的格式:
    从低位开始存。例如上述的地址:
    { 0xD8, 0x01, 0x29, 0x11, 0x21, 0x04}

3.开始连接

1
2
3
4
5
6
7
8
9
10
11
12
if (!isFound)
{
Console.WriteLine("没有搜索到设备");
return;
}
BluetoothEndPoint ep = new BluetoothEndPoint(blueAddress, BluetoothService.SerialPort);
Console.WriteLine("正在连接!");
client.Connect(ep); //开始配对 蓝牙4.0不需要setpin
if (client.Connected)
{
Console.WriteLine("连接成功!");
}

4.发送数据

1
2
3
4
5
6
Stream peerStream = client.GetStream();//创建IO流对象
Console.ReadKey();//按一下再发送数据
string str = "Hello,world!";
//字符串类型转字节类型
byte[] byteArray = System.Text.Encoding.Default.GetBytes(str);
peerStream.Write(byteArray, 0, byteArray.Length); // 发送数据

5.完整C#程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using InTheHand.Net;
using InTheHand.Net.Bluetooth;
using InTheHand.Net.Sockets;
using System.IO;

namespace TestBluetooth
{
internal class Program
{
static void Main(string[] args)
{
bool isFound = false;//是否搜寻到蓝牙
BluetoothClient client = new BluetoothClient(); //处理蓝牙的对象
BluetoothRadio radio = BluetoothRadio.PrimaryRadio; //获取电脑蓝牙
radio.Mode = RadioMode.Connectable; //设置电脑蓝牙可被搜索到
BluetoothAddress blueAddress = new BluetoothAddress(new byte[]//需要连接的蓝牙模块的唯一标识符
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });//要赋初值,不然会报错
BluetoothDeviceInfo[] devices = client.DiscoverDevices(); //搜索蓝牙设备,10秒

foreach (var item in devices)
{
if (item.DeviceName.Equals("HC-04")) //根据蓝牙名字找
{
Console.WriteLine(item.DeviceAddress);
Console.WriteLine(item.DeviceName);
blueAddress = item.DeviceAddress; //获得蓝牙模块的唯一标识符
isFound = true;
break;
}
}
if (!isFound)
{
Console.WriteLine("没有搜索到设备");
return;
}
BluetoothEndPoint ep = new BluetoothEndPoint(blueAddress, BluetoothService.SerialPort);
Console.WriteLine("正在连接!");
client.Connect(ep); //开始配对 蓝牙4.0不需要setpin
if (client.Connected)
{
Console.WriteLine("连接成功!");

Stream peerStream = client.GetStream(); //创建IO流对象
Console.ReadKey();//按一下再发送数据
string str = "Hello,world!";
//字符串类型转字节类型
byte[] byteArray = System.Text.Encoding.Default.GetBytes(str);
peerStream.Write(byteArray, 0, byteArray.Length); // 发送数据

}
}
}
}

五、测试

  • 1.将HC-04通过CH340与电脑连接
  • 2.打开串口调试助手,把波特率调到9600,打开串口
    串口调试助手
  • 3.运行刚刚写的程序,等待连接
    程序
  • 连接成功后,按任意键发送,检查串口调试助手
    发送结果
    发送成功。

参考链接

不一样的蓝牙连接方式——C#程序实现蓝牙通信

C# 蓝牙开发(经典蓝牙)

C#蓝牙开发 “BluetoothRadio”未包含“PrimaryRadio”的定义