控制台示例
这一篇带你跑通最小闭环:创建宿主、声明通道、启动、写入、收到回显、停止。
控制台示例最适合第一次验证,因为它不需要窗口、不需要串口硬件、不需要设备手册。
直接运行仓库示例
在仓库的 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();
真实项目里即使你忘了显式调用 StopAsync,await using 退出时也会释放宿主。但示例里写出来,是为了让生命周期更清楚。
换成真实串口
虚拟通道跑通后,把:
builder.AddVirtualChannel("meter");
换成:
builder.AddSerialPort("meter", "COM3", 9600);
其它代码先不要动。这样你可以确认问题到底在设备连接,还是在程序结构。
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
提示无法写入,当前为 Created | 还没 StartAsync | 先启动宿主再写入 |
收不到 PING | 事件订阅太晚或程序退出太快 | 写入前订阅 DataReceived,示例里保留短暂 Delay |
| 换串口后打不开 | COM 口不对或被占用 | 看设备管理器,关闭串口调试助手 |
| 字符乱码 | 设备不是 ASCII / UTF-8 文本 | 按十六进制查看原始字节 |
下一步:做界面请看 第一个 WinForms 应用 或 第一个 WPF 应用。