继C# Modbus TCP/IP学习记录后,尝试串口通信。
操作步骤:
1.使用Visual Studio安装Nuget包NModbus.Serial。
2.使用Modbus Slave应用程序,工具栏Connection项,单击Connect,弹窗Connection Setup,修改Connection下拉框为Serial Port,下列配置按实际需求修改:
(端口此时使用的虚拟端口)
3.回到Visual Studio的控制台应用程序,输入以下代码,代码含有读写方法,按需修改:
using System;
using System.IO.Ports;
using NModbus;
using NModbus.Serial;
class ModbusRtuMaster
{
static void Main(string[] args)
{
try
{
// 配置串口参数
string portName = "COM31"; //串口号
int baudRate = 9600;// 波特率
Parity parity = Parity.None; // 校验位
int dataBits = 8;// 数据位
StopBits stopBits = StopBits.One; // 停止位
// 初始化串口
using (SerialPort serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits))
{
serialPort.Open();
Console.WriteLine($"Modbus RTU 主站已启动,连接到 {portName}...");
// 创建 Modbus RTU 主站
var factory = new ModbusFactory();
IModbusSerialMaster master = factory.CreateRtuMaster(new SerialPortAdapter(serialPort));
// 从站地址
byte slaveId = 1;
// 测试读取保持寄存器
ushort startAddress = 0; // 寄存器地址
ushort numRegisters = 10; // 读取 10 个寄存器
ushort[] readValues = ReadHoldingRegisters(master, slaveId, startAddress, numRegisters);
Console.WriteLine("读取到的寄存器数据:");
for (int i = 0; i < readValues.Length; i++)
{
Console.WriteLine($"寄存器 {startAddress + i}: {readValues[i]}");
}
// 测试写入单个寄存器
ushort writeAddress = 0; // 写入的寄存器地址
ushort writeValue = 21; // 要写入的值
WriteSingleRegister(master, slaveId, writeAddress, writeValue);
Console.WriteLine($"已写入寄存器 {writeAddress}: {writeValue}");
// 再次读取以验证写入是否成功
ushort[] updatedValues = ReadHoldingRegisters(master, slaveId, startAddress, numRegisters);
Console.WriteLine("更新后的寄存器数据:");
for (int i = 0; i < updatedValues.Length; i++)
{
Console.WriteLine($"寄存器 {startAddress + i}: {updatedValues[i]}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
Console.ReadLine();
}
/// <summary>
/// 读取保持寄存器
/// </summary>
public static ushort[] ReadHoldingRegisters(IModbusSerialMaster master, byte slaveId, ushort startAddress, ushort numRegisters)
{
return master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
}
/// <summary>
/// 写入单个保持寄存器
/// </summary>
public static void WriteSingleRegister(IModbusSerialMaster master, byte slaveId, ushort address, ushort value)
{
master.WriteSingleRegister(slaveId, address, value);
}
}
4.运行结果: