狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

【C#】簡單的藍牙助手

admin
2024年1月30日 16:8 本文熱度 795
框架

利用ESP32來模擬BT藍牙(BLE低功耗藍牙后續也會進行測試)
C#利用32feet.NET庫來實現藍牙的使用。
準備工作
界面布局

這個界面基本也是搬運至前面的串口助手界面,目前制作了發送和接收界面。并且代碼邏輯也比較簡單,還需要有很大的修改。
軟件流程
(1)初始化掃描藍牙設備寫入選擇框
(2)連接藍牙設備,連接成功則開啟監聽線程
(3)監聽線程接收到數據設置回調函數將接收到的內容顯示在文本框上。
(4)點擊發送按鈕后將文本框的內容發送給接收端。
核心代碼
初始化
private async void Booth_Init(){    try    {        client = new BluetoothClient();        // 使用 Task.Run 來在另一個線程中執行 DiscoverDevices        devices = await Task.Run(() => client.DiscoverDevices());        BoothChoose.Items.Clear();        foreach (BluetoothDeviceInfo device in devices)        {            // 確保 UI 更新在 UI 線程上執行            this.Invoke((MethodInvoker)delegate            {                BoothChoose.Items.Add(device.DeviceName);            });
           Console.WriteLine(device.DeviceName);        }
       // 確保在 UI 線程上修改 SelectedIndex        this.Invoke((MethodInvoker)delegate        {            if (BoothChoose.Items.Count > 0)            {                BoothChoose.SelectedIndex = 0;            }        });    }    catch (Exception ex)    {        Console.WriteLine("錯誤: " + ex.Message);    }}
初始化的代碼是使用異步的方式掃描設備,并且將設備名稱顯示在選擇控件上,之所以是采用異步的方式原因是不采用異步會占用UI線程導致UI線程無法使用。所以需要單獨開線程來初始化,同時該函數也可以用于重新掃描設備。
藍牙連接
private async void BoothConnect(){    try    {        if (BoothChoose.Items.Count != 0)        {            string selectedDeviceName = BoothChoose.SelectedItem.ToString();
           // 尋找匹配的設備            BluetoothDeviceInfo deviceToConnect = devices.FirstOrDefault(d => d.DeviceName == selectedDeviceName);            if (deviceToConnect != null)            {                // 連接到設備                await Task.Run(() => client.Connect(deviceToConnect.DeviceAddress, BluetoothService.SerialPort));                MessageBox.Show("連接成功", "信息");                if (client.Connected)                {                    stream = client.GetStream();                    StartListening(OnDataReceived); // 開始監聽數據并指定回調                }            }            else            {                MessageBox.Show("未找到選定的設備", "警告");            }        }        else        {            MessageBox.Show("未檢測到設備", "警告");        }    }    catch (Exception ex)    {        MessageBox.Show("藍牙連接失敗: " + ex.Message, "錯誤");    }}
連接藍牙的代碼,根據選擇控件選擇的藍牙名稱匹配對應的藍牙設別,接著使用異步的方式來連接藍牙,防止連接藍牙的過程中導致UI線程卡頓無法使用。
并且使用一個Stream流變量來接收藍牙傳輸的信息,調用StartListening函數來實現藍牙設備的監聽
監聽函數
private void StartListening(Action<string> callback){    Task.Run(() =>    {        byte[] buffer = new byte[1024]; // 數據緩沖區        int bytes;
       try        {            while (client.Connected)            {                bytes = stream.Read(buffer, 0, buffer.Length);                if (bytes > 0)                {                    string receivedData = Encoding.UTF8.GetString(buffer, 0, bytes);                    this.Invoke((MethodInvoker)delegate                    {                        callback(receivedData); // 在UI線程上調用回調                    });                }            }        }        catch (IOException ex)        {            // 連接丟失或讀取錯誤            this.Invoke((MethodInvoker)delegate            {                MessageBox.Show("讀取數據錯誤: " + ex.Message, "錯誤");            });        }    });}
private void OnDataReceived(string data){    if (Receive.InvokeRequired)    {        // 如果調用線程不是創建Receive控件的線程,則使用Invoke調用        Receive.Invoke(new MethodInvoker(delegate        {            Receive.AppendText(data);        }));    }    else    {        // 如果已經在UI線程,則直接更新        Receive.AppendText(data);    }}
監聽函數中我們異步監聽數據,并且設置OnDataReceived回調函數處理接收到的數據。
發送數據
private void TransButton_Click(object sender, EventArgs e){    try    {        // 獲取要發送的文本        string dataToSend = TransText.Text;        if (NewLine.Checked)        {            dataToSend += Environment.NewLine;        }        if (client != null && client.Connected)        {            Stream stream = client.GetStream();            if (stream.CanWrite)            {                // 將文本轉換為字節數據                byte[] buffer = Encoding.UTF8.GetBytes(dataToSend);                // 發送數據                stream.Write(buffer, 0, buffer.Length);            }        }        else        {            MessageBox.Show("Bluetooth is not connected.");        }    }    catch (Exception ex)    {        MessageBox.Show("Error sending data: " + ex.Message);    }}
效果展示

ESP32中的代碼是利用藍牙傳輸接收到的信息。
因此我們發送信息會接收到發送的信息。


該文章在 2024/1/31 15:49:23 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved