通讯 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
方法来发送字节数组或其他类型的数据。
希望这些信息能够帮助你解决问题。