banner
xingli

xingli

猫娘爱好者

godot读取串口数据

通讯 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 方法来发送字节数组或其他类型的数据。

希望这些信息能够帮助你解决问题。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。