C# nmodbus读保持寄存器冻结

C# nmodbus读保持寄存器冻结,c#,modbus,C#,Modbus,我试图从COM端口读取modbus寄存器,我使用的是NModbus4寄存器,但当使用readHoldingRegister时,它将在那里冻结。 这是我的源代码: public static void ModbusSerialAsciiMasterReadRegisters() { using (SerialPort port = new SerialPort("COM4")) { // configure serial port

我试图从COM端口读取modbus寄存器,我使用的是NModbus4寄存器,但当使用readHoldingRegister时,它将在那里冻结。 这是我的源代码:

public static void ModbusSerialAsciiMasterReadRegisters()
    {
        using (SerialPort port = new SerialPort("COM4"))
        {
            // configure serial port
            port.BaudRate = 9600;
            port.DataBits = 8;
            port.Parity = Parity.None;
            port.StopBits = StopBits.One;
            port.Open();

            var adapter = new SerialPortAdapter(port);

            var factory = new ModbusFactory();

            // create modbus master
            IModbusSerialMaster master = factory.CreateAsciiMaster(adapter);

            byte slaveId = 1;
            ushort startAddress = 8193;
            ushort numRegisters = 5;

            // read five registers      
            try
            {
                ushort[] registers = master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
                for (int i = 0; i < numRegisters; i++)
                {
                    Console.WriteLine($"Register {startAddress + i}={registers[i]}");
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex);
            }


        }

    }
}
publicstaticvoid modbusseialascimasterreadregisters()
{
使用(SerialPort端口=新的SerialPort(“COM4”))
{
//配置串行端口
波特率=9600;
port.DataBits=8;
端口奇偶性=奇偶性。无;
port.StopBits=StopBits.One;
port.Open();
var适配器=新的SerialPortAdapter(端口);
var工厂=新的ModbusFactory();
//创建modbus主机
IModbusSerialMaster master=factory.CreateAsciiMaster(适配器);
字节slaveId=1;
ushort startAddress=8193;
ushort numRegisters=5;
//读取五个寄存器
尝试
{
ushort[]registers=master.ReadHoldingRegisters(slaveId、startAddress、numRegisters);
对于(int i=0;i
设置读超时和写超时。在我的情况下,我使用200毫秒

port.ReadTimeout = 200;
port.WriteTimeout= 200;
对于我的用例,如果通信需要200毫秒以上,那是因为没有硬件。根据您使用的通信硬件,必须更改此值

编辑:只是一个离题的改进:IModbusSerialMaster是可识别的。使用块将其放入一个

希望这有帮助