0.引言
本文通过VisualStudio的C#开发桌面软件,实现蓝牙搜索、连接功能,并且能发送消息给HC-05蓝牙,也能接收HC-05回传的消息。本文在“ VisualStudio如何进行桌面软件开发?”一文的基础上,进行了第一次规范性应用,总结了这次开发经验。
1.安装蓝牙库
安装InTheHand.Net.Bluetooth库。
2.软件布局
3.代码编写
(1)初始化设置;
private void Form1_Load(object sender, EventArgs e)
{
//因需持续接收蓝牙信息,为防止卡死界面,需要开启线程
//开启线程后,若要在线程中操作主界面控件,需要以下代码取消线程控件检查
Control.CheckForIllegalCrossThreadCalls = false;
}
(2)编写【搜索蓝牙】功能,双击搜索蓝牙按钮开始编写该按钮功能;
private void button1_Click(object sender, EventArgs e)
{
BluetoothClient client = new BluetoothClient();//处理蓝牙的对象
BluetoothRadio radio = BluetoothRadio.Default;//获取电脑蓝牙
radio.Mode = RadioMode.Connectable;//设置电脑蓝牙可被搜索到
BluetoothDeviceInfo[] devices = client.DiscoverDevices().ToArray();//搜索蓝牙设备,10秒
richTextBox1.Text = "";
foreach (var item in devices)
{
richTextBox1.AppendText(item.DeviceName + "\n");
}
}
(3)编写【连接蓝牙】功能,双击连接蓝牙按钮开始编写该按钮功能;
BluetoothClient client = new BluetoothClient();//处理蓝牙的对象
BluetoothAddress blueAddress = null;//需要连接的蓝牙模块的唯一标识符
private void button2_Click(object sender, EventArgs e)
{
BluetoothDeviceInfo[] devices = client.DiscoverDevices().ToArray();
foreach (var item in devices)
{
if (item.DeviceName.Equals(textBox1.Text))//根据蓝牙名字找
{
blueAddress = item.DeviceAddress;//获得蓝牙模块的唯一标识符
break;
}
}
richTextBox1.Text = "";
Thread listenThread;//监听线程
listenThread = new Thread(ReceiveData);
listenThread.Start();
}
/// <summary>
/// 接收数据
/// </summary>
private void ReceiveData()
{
BluetoothEndPoint ep = new BluetoothEndPoint(blueAddress, BluetoothService.SerialPort);
richTextBox1.AppendText("正在连接!" + "\n");
client.Connect(ep);
richTextBox1.AppendText("连接成功!" + "\n");
while (client.Connected)
{
string receive = string.Empty;
NetworkStream peerStream = client.GetStream();
byte[] buffer = new byte[1024];
peerStream.Read(buffer, 0, buffer.Length);
receive = Encoding.UTF8.GetString(buffer).ToString();
receive = Remove_0(receive);//格式处理,可根据情况改写函数
//richTextBox1.AppendText(receive + "\n");
string strTemp = "";
if (receive.Length > 10)//接收的信息有中断情况,这里判断数据位数是否达到10位以上,未达到说明中断了,需要连接信息
{
richTextBox1.AppendText(strTemp+receive + "\n");
strTemp = "";
}
else
{
strTemp = receive;
}
Thread.Sleep(100);
}
}
private string Remove_0(string str)
{
string result = "";
char[] chars = str.ToCharArray();
for (int i = 0; i < chars.Count(); i++)
{
if (chars[i] != '\0' && chars[i] != '\r' && chars[i] != '\n')
{
result += chars[i];
}
}
return result;
}
(4)编写【发送指令】功能,双击发送指令按钮开始编写该按钮功能。
private void button3_Click(object sender, EventArgs e)
{
if (client!=null)
if (client.Connected)
{
NetworkStream peerStream = client.GetStream();//创建IO流对象
string str = textBox1.Text;
byte[] buffer = System.Text.Encoding.GetEncoding("gb2312").GetBytes(str);
peerStream.Write(buffer, 0, buffer.Length);// 发送指令
richTextBox1.AppendText("发送成功!" + "\n");
}
}
4.功能演示
(1)注意连接HC-05蓝牙前,必须将与HC-05配对过的设备取消配对;
(2)第一连接蓝牙需要设置PIN;
(3)启动程序,搜索蓝牙;
(4)输入蓝牙名称:HC-05,连接蓝牙;
(5)输入指令:s,发送指令(这里的指令需要在HC-05接收端设置)。
5.源代码
参考网址:
[1] cacrle. VisualStudio如何进行桌面软件开发?; 2023-03-18 [accessed 2023-03-28].
[2] 打代码的小明. 不一样的蓝牙连接方式——C#程序实现蓝牙通信; 2021-01-09 [accessed 2023-03-28].
[3] weixin_30341745. C#:蓝牙串口读数据和写数据; 2019-07-19 [accessed 2023-03-28].
[4] 努力成为好爸爸. 客户端实现蓝牙接收(C#); 2017-11-21 [accessed 2023-03-28].
[5] 东边的小山. [C#] 控制电脑蓝牙与外部蓝牙设备通信; 2022-02-19 [accessed 2023-03-28].
[6] M_Q. C# string类型和byte[]类型相互转换; 2016-10-12 [accessed 2023-03-28].
[7] ksr12333. C#蓝牙开发 “BluetoothRadio”未包含“PrimaryRadio”的定义; 2022-03-08 [accessed 2023-03-28].
[8] Air_Alter. 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败问题; 2017-12-25 [accessed 2023-03-28].
[9] cacrle. Arduino开发之如何连接蓝牙模块?; 2023-03-27 [accessed 2023-03-28].