banner
xingli

xingli

猫娘爱好者

donet使用教程

通訊 nuget 包#

NuGet 畫廊 | 系統.IO. 端口 8.0.0 - 預覽.3.23174.8

dotnet add package System.IO.Ports --version 8.0.0-preview.3.23174.8

創建 Serial 實例#

解釋下這個 SerialPort mySerialPort = new SerialPort ("COM17", 9600, Parity.None, 8, StopBits.One);

這行程式碼創建了一個 SerialPort 類的實例,用於與串口進行通訊。SerialPort 類的構造函數接受以下參數:

  • portName(字串):串口名稱,例如 "COM17"
  • baudRate(整數):波特率,例如 9600
  • parityParity 枚舉):奇偶校驗位,例如 Parity.None
  • dataBits(整數):資料位數,例如 8
  • stopBitsStopBits 枚舉):停止位數,例如 StopBits.One

在上面的程式碼中,我們創建了一個 SerialPort 物件,用於與名稱為 "COM17" 的串口進行通訊。我們指定了波特率為 9600,不使用奇偶校驗位,資料位數為 8,停止位數為 1

你可以根據你的實際情況修改這些參數,以便與你的開發板進行通訊。

通訊編碼#

修改通訊編碼

如果編碼是 utf8

如果你的開發板使用的是 UTF-8 編碼,那麼你可以在創建 SerialPort 物件時指定 Encoding 屬性為 System.Text.Encoding.UTF8,如下所示:

SerialPort mySerialPort = new SerialPort("COM17", 9600, Parity.None, 8, StopBits.One);
mySerialPort.Encoding = System.Text.Encoding.UTF8;

這樣,你的 Godot 程式就會使用 UTF-8 編碼來讀取串口資料,從而避免出現亂碼問題。

????

如果你在控制台中看到了一堆問號,這可能是由於字元編碼問題導致的。串口通訊時,傳送方和接收方需要使用相同的字元編碼,否則接收到的資料可能會出現亂碼。

你可以檢查你的開發板傳送資料時使用的字元編碼,並確保在你的 Godot 程式中使用相同的字元編碼來讀取資料。例如,如果你的開發板使用的是 ASCII 編碼,那麼你可以在創建 SerialPort 物件時指定 Encoding 屬性,如下所示:

SerialPort mySerialPort = new SerialPort("COM17", 9600, Parity.None, 8, StopBits.One);
mySerialPort.Encoding = System.Text.Encoding.ASCII;

希望這些資訊能夠幫助你解決問題。

如果你的程式無法從串口讀取資料,可能有以下幾種原因:

  1. 串口名稱不正確。請確保你在 SerialPort 類的構造函數中指定的串口名稱與你的開發板連接的串口名稱相同。
  2. 波特率不正確。請確保你在 SerialPort 類的構造函數中指定的波特率與你的開發板使用的波特率相同。
  3. 串口未打開。請確保你呼叫了 SerialPort.Open 方法來打開串口。
  4. 開發板未傳送資料。請確保你的開發板正在通過串口傳送資料。

你可以使用 SerialPort.IsOpen 屬性來檢查串口是否已打開。如果該屬性返回 true,則表示串口已打開;否則表示串口未打開。

此外,你還可以在 catch (TimeoutException) 語句塊中添加一些調試資訊,以幫助你確定問題所在。例如,你可以這樣做:

try
{
    string message = mySerialPort.ReadLine();
    GD.Print(message);
}
catch (TimeoutException)
{
    GD.Print("TimeoutException: Failed to read data from serial port.");
}

希望這些資訊能夠幫助你解決問題。

多線程#

是的,這段程式碼中的 while (true) 迴圈會一直運行,直到你手動關閉程式。這可能會導致你的 Godot 專案在啟動後卡死。

如果你希望在 Godot 中讀取串口資料,但不希望阻塞主線程,你可以考慮使用線程或計時器來實現。例如,你可以使用 System.Threading.Thread 類來創建一個新的線程,在該線程中讀取串口資料並將其列印到控制台。下面是一個簡單的示例程式碼:

using Godot;
using System;
using System.IO.Ports;
using System.Threading;

public partial class io : Node
{
    private bool _isRunning = true;

    public override void _Ready()
    {
        // 創建並啟動新線程
        Thread thread = new Thread(ReadSerialPort);
        thread.Start();
    }

    private void ReadSerialPort()
    {
        // 設定串口名稱、波特率和超時時間
        SerialPort mySerialPort = new SerialPort("COM17", 115200, Parity.None, 8, StopBits.One);
        mySerialPort.ReadTimeout = 500;

        // 打開串口
        mySerialPort.Open();

        // 讀取資料並列印到控制台
        while (_isRunning)
        {
            try
            {
                string message = mySerialPort.ReadLine();
                GD.Print(message);
            }
            catch (TimeoutException) { }
        }

        // 關閉串口
        mySerialPort.Close();
    }

    public override void _ExitTree()
    {
        // 停止線程
        _isRunning = false;
    }
}

在上面的程式碼中,我們創建了一個新的線程,並在該線程中讀取串口資料。當 Godot 專案退出時,我們會通過設定 _isRunning 變數為 false 來停止線程。這樣,我們就可以在不阻塞主線程的情況下讀取串口資料了。

發送串口資料#

如果你想通過串口向開發板傳送資料,你可以使用 SerialPort 類的 Write 方法或 WriteLine 方法。例如,下面的程式碼演示了如何向開發板傳送一條字串:

// 設定串口名稱、波特率和超時時間
SerialPort mySerialPort = new SerialPort("COM17", 9600, Parity.None, 8, StopBits.One);

// 打開串口
mySerialPort.Open();

// 向開發板傳送資料
string message = "Hello, world!";
mySerialPort.WriteLine(message);

// 關閉串口
mySerialPort.Close();

在上面的程式碼中,我們使用 WriteLine 方法向開發板傳送了一條字串。你也可以使用 Write 方法來傳送位元組陣列或其他類型的資料。

希望這些資訊能夠幫助你解決問題。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。