通訊 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
。parity
(Parity
枚舉):奇偶校驗位,例如Parity.None
。dataBits
(整數):數據位數,例如8
。stopBits
(StopBits
枚舉):停止位數,例如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;
希望這些信息能夠幫助你解決問題。
如果你的程序無法從串口讀取數據,可能有以下幾種原因:
- 串口名稱不正確。請確保你在
SerialPort
類的構造函數中指定的串口名稱與你的開發板連接的串口名稱相同。 - 波特率不正確。請確保你在
SerialPort
類的構造函數中指定的波特率與你的開發板使用的波特率相同。 - 串口未打開。請確保你調用了
SerialPort.Open
方法來打開串口。 - 開發板未發送數據。請確保你的開發板正在通過串口發送數據。
你可以使用 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
方法來發送字節數組或其他類型的數據。
希望這些信息能夠幫助你解決問題。