跳到主要内容

控制台示例

这一篇带你跑通最小闭环:创建宿主、声明通道、启动、写入、收到回显、停止。

控制台示例最适合第一次验证,因为它不需要窗口、不需要串口硬件、不需要设备手册。

直接运行仓库示例

在仓库的 code 目录执行:

dotnet run --project samples/Zeus.Samples.Console.Headless

你应该看到类似输出:

通道 meter 状态:Open
收到回显:PING
宿主已停止。把复杂留给 Zeus,把简单留给用户。

如果看到 PING,说明 Zeus 的基础链路已经跑通。

完整代码

using System.Text;
using Zeus;

await using var app = ZeusHost.Create(builder =>
{
builder.AddVirtualChannel("meter");
});

var meter = app.Channels.Get("meter");
meter.DataReceived += (_, e) =>
{
var text = Encoding.ASCII.GetString(e.Data.Span);
Console.WriteLine($"收到回显:{text}");
};

await app.StartAsync();
Console.WriteLine($"通道 {meter.Name} 状态:{meter.State}");

await meter.WriteAsync(Encoding.ASCII.GetBytes("PING"));
await Task.Delay(200);

await app.StopAsync();
Console.WriteLine("宿主已停止。把复杂留给 Zeus,把简单留给用户。");

每一段在做什么

1. 创建宿主

await using var app = ZeusHost.Create(builder =>
{
builder.AddVirtualChannel("meter");
});

ZeusHost.Create 创建 Zeus 宿主。AddVirtualChannel("meter") 声明一条名为 meter 的虚拟通道。虚拟通道的特点是:你写入什么,它就回显什么。

2. 拿到通道

var meter = app.Channels.Get("meter");

meter 是通道名。后续写入、订阅接收事件、查看状态都通过这个对象完成。

3. 订阅接收事件

meter.DataReceived += (_, e) =>
{
var text = Encoding.ASCII.GetString(e.Data.Span);
Console.WriteLine($"收到回显:{text}");
};

真实串口收到字节时也会触发 DataReceived。虚拟通道只是把你写入的字节立刻触发回来。

4. 启动后才能写入

await app.StartAsync();
await meter.WriteAsync(Encoding.ASCII.GetBytes("PING"));

StartAsync 会打开所有通道。没有启动前写入会失败,这是为了避免你把数据写到尚未打开的端口。

5. 停止并释放资源

await app.StopAsync();

真实项目里即使你忘了显式调用 StopAsyncawait using 退出时也会释放宿主。但示例里写出来,是为了让生命周期更清楚。

换成真实串口

虚拟通道跑通后,把:

builder.AddVirtualChannel("meter");

换成:

builder.AddSerialPort("meter", "COM3", 9600);

其它代码先不要动。这样你可以确认问题到底在设备连接,还是在程序结构。

常见问题

现象原因处理
提示无法写入,当前为 Created还没 StartAsync先启动宿主再写入
收不到 PING事件订阅太晚或程序退出太快写入前订阅 DataReceived,示例里保留短暂 Delay
换串口后打不开COM 口不对或被占用看设备管理器,关闭串口调试助手
字符乱码设备不是 ASCII / UTF-8 文本按十六进制查看原始字节

下一步:做界面请看 第一个 WinForms 应用第一个 WPF 应用