一、背景与选型
随着国产工控机在工业自动化领域的普及,Linux 系统凭借稳定、安全、可裁剪的优势成为上位机部署的首选。传统 WinForm/WPF 方案无法直接跨平台运行,而 Avalonia UI + .NET 技术栈凭借原生跨平台能力,成为国产 Linux 工控机上位机开发的最优解之一。
本文提供一个可直接运行的 Modbus RTU 串口通信最简 Demo,涵盖从环境搭建到 Linux 部署的完整流程。
技术栈选型
二、环境准备
2.1 开发环境(Windows)
- 安装 Visual Studio 2022 + .NET 8 SDK
dotnet new install Avalonia.Templates
dotnet new avalonia.mvvm -o ModbusRtuDemo
dotnet add package NModbus4.NetCoredotnet add package System.IO.Ports
2.3 Linux 工控机环境
国产工控机(如飞腾、瑞芯微、龙芯 x86/ARM)预装 Ubuntu/Debian 系系统:
- USB 转 485/232:
/dev/ttyUSB0、/dev/ttyUSB1 - 板载串口:
/dev/ttyS0、/dev/ttyS1
三、最简 Demo 核心代码
3.1 主界面 XAML(MainView.axaml)
3.2 ViewModel 核心逻辑(MainViewModel.cs)这是整个 Demo 的核心代码,仅几十行即可实现 Modbus RTU 通信:关键点说明:
RtsEnable = false 和 DtrEnable = false 在 Linux 下必须关闭,否则会导致串口异常
必须设置 ReadTimeout,否则阻塞读取会挂起线程
Modbus 操作建议放后台线程,最简 Demo 直接同步调用仅作演示
dotnet publish -c Release -r linux-x64 --self-contained false
dotnet publish -c Release -r linux-arm64 --self-contained false
# 上传到工控机(scp 或 U 盘)cd publish目录chmod +x ModbusRtuDemo./ModbusRtuDemo
# 查看可用串口ls /dev/ttyUSB* /dev/ttyS*# 测试串口权限cat /dev/ttyUSB0# 查看串口芯片驱动dmesg | grep tty
- Linux 串口权限不足:必须加入
dialout 组,不要用 sudo 跑 GUI 程序 - 串口名写错:Windows 是
COM3,Linux 是 /dev/ttyUSB0,注意区分 - RTS/DTR 信号干扰:Linux 下默认启用会导致 485 芯片方向控制异常,务必关闭
- UI 线程阻塞:实际项目中 Modbus 通信需放
Task.Run 后台线程,避免界面卡死 - 帧间隔问题:NModbus4 已内置 3.5 字符间隔处理,无需手动加延时
关注评论或回复【888】得:《本文的完整源码+十套项目实战完整源码》↓↓↓