排错
遇到问题时先不要急着改代码。按这个顺序定位:安装能不能编译、宿主有没有启动、通道有没有打开、协议有没有回包、点表有没有值、界面有没有正确绑定。
先做三步快速判断
- 把真实串口换成
AddVirtualChannel,看程序结构是否能跑通。 - 打印通道状态
channel.State,确认是否进入Open。 - 把收到的数据先按十六进制打印,不要一开始就按文本解析。
channel.DataReceived += (_, e) =>
{
Console.WriteLine(Convert.ToHexString(e.Data.Span));
};
安装和包引用
| 现象 | 最可能原因 | 处理 |
|---|---|---|
dotnet 命令不存在 | 没装 .NET SDK,或 PATH 未刷新 | 安装 .NET 8 SDK,重新打开终端 |
| 找不到 Zeus 预览包 | 没加 --prerelease | dotnet add package Zeus.Communications --prerelease |
找不到 AddVirtualChannel | 没引用 Zeus.Communications | 安装或引用通信包 |
找不到 AttachZeus | 没引用 UI 适配器 | WinForms 引 Zeus.Presentation.WinForms,WPF 引 Zeus.Presentation.Wpf |
| WinForms / WPF 包还原失败 | 目标框架不是 Windows 桌面 | 改成 net8.0-windows |
宿主和名称
| 现象 | 最可能原因 | 处理 |
|---|---|---|
找不到名为 xxx 的通道 | Channels.Get 的名称和注册名称不一致 | 看异常里列出的已注册通道名 |
通道名称已存在 | 注册了两个同名通道 | 改名,例如 meterBus、plcBus |
当前为 Created,无法写入 | 还没调用 StartAsync | 先启动宿主 |
| 关闭程序后端口仍被占用 | 宿主没释放 | 使用 await using,或让 AttachZeus 管理窗口生命周期 |
串口和 TCP
| 现象 | 最可能原因 | 处理 |
|---|---|---|
| 串口打开失败 | COM 口不存在或被占用 | 看设备管理器,关闭串口助手 |
| 串口能打开但无数据 | 接线、波特率、校验位或设备未回包 | 先用串口助手确认设备能通信 |
| 收到乱码 | 把二进制协议当文本显示 | 用 Convert.ToHexString 看原始字节 |
| TCP 连接失败 | IP、端口、防火墙或设备未监听 | 先用网络工具确认端口可连 |
| 对端断开后通道 Faulted | TCP 连接被关闭 | 记录日志并重启宿主或重建连接 |
自定义帧
| 现象 | 最可能原因 | 处理 |
|---|---|---|
| 超时未收到完整应答 | 帧头、长度、校验或设备没有回包 | 抓原始字节,对照设备手册 |
| 超时未收到匹配应答 | 收到的帧不满足匹配器 | 打印响应载荷,检查序号、命令字、地址 |
| 校验失败后一直没数据 | 校验算法或覆盖范围不一致 | 确认校验是否覆盖长度域和载荷 |
| 载荷超过 255 字节 | 使用了 1 字节长度 | 改用 2 字节长度字段 |
Modbus
| 现象 | 最可能原因 | 处理 |
|---|---|---|
| 一直超时 | 从站地址、波特率、RTU/TCP 类型不对 | 先用 ModbusSlaveResponder 验证主站逻辑 |
非法数据地址 | 地址偏移或数量不对 | 检查 40001 是否要写成地址 0 |
| CRC 失败 | 串口参数不一致或线路干扰 | 核对 9600/8N1/校验位,缩短线缆测试 |
| 事务号不匹配 | 同一 TCP 通道并发多路请求 | 串行请求,或为不同任务拆通道 |
| 读到的值比例不对 | 少了比例换算 | 在点表中使用 scale 或 raw => raw * 0.1 |
点表和采集
| 现象 | 最可能原因 | 处理 |
|---|---|---|
点尚无有效值 | 第一轮采集还没成功 | 订阅 Points.Changed,或稍后再读 |
| 点名在多台设备上重复 | 短名冲突 | 使用 oven.temperature 这种限定名 |
| 界面显示旧值但有错误 | 本轮采集失败,保留了上一次成功值 | 查看点快照的 Error |
| 总线很慢 | 采集间隔太短或地址太分散 | 加大间隔,让地址尽量连续 |
JSON 配置
| 现象 | 最可能原因 | 处理 |
|---|---|---|
| 找不到配置文件 | 工作目录不对,或文件没复制到输出目录 | 看异常中的绝对路径,设置 CopyToOutputDirectory |
channel 未在 channels 中声明 | 设备引用了不存在的通道 | 先声明通道,再声明设备 |
| 改了 COM 口但没生效 | 通道配置不热更新 | 重启程序 |
| 改了采集间隔但没生效 | JSON 语法错误或没有监视文件 | 看日志,确认 watch: true |
WinForms / WPF
| 现象 | 最可能原因 | 处理 |
|---|---|---|
| 控件跨线程异常 | 直接在 DataReceived 中改 UI | 使用 BindTo / BindState / AttachZeus |
| 界面状态不刷新 | 没绑定状态,或绑定发生太晚 | 在构造函数里调用 BindState |
| 关闭窗口后仍在采集 | 宿主没跟窗口生命周期绑定 | 使用 this.AttachZeus(...) |
| 点击发送失败 | 通道还没打开 | 看状态 Label 是否为 Open |
仍然定位不了
请准备这些信息再继续查:
- Zeus 版本和运行环境。
- 使用的是虚拟通道、串口还是 TCP。
- 串口参数或 TCP 地址。
- 发送的原始字节和收到的原始字节。
- 完整异常消息,不要只截第一行。
- 如果是 Modbus,提供从站地址、功能码、起始地址和数量。