diff --git a/csharp/Lib/Protocols/Modbus/Channels/SerialPortChannel.cs b/csharp/Lib/Protocols/Modbus/Channels/SerialPortChannel.cs index 35e6ef694..d670bb51c 100644 --- a/csharp/Lib/Protocols/Modbus/Channels/SerialPortChannel.cs +++ b/csharp/Lib/Protocols/Modbus/Channels/SerialPortChannel.cs @@ -27,7 +27,11 @@ public class SerialPortChannel : ConnectionChannel _Open = () => { - var serialPort = new SerialPort(portName, baudRate, parity, dataBits, sb); + var serialPort = new SerialPort(portName, baudRate, parity, dataBits, sb) + { + ReadTimeout = 1000, // milliseconds + WriteTimeout = 1000 // milliseconds + }; serialPort.Open(); return serialPort; }; @@ -40,18 +44,29 @@ public class SerialPortChannel : ConnectionChannel protected override IReadOnlyList Read(SerialPort serialPort, Int32 nBytes) { var buffer = new Byte[nBytes]; - var bytesReceived = 0; - do + + try { - var received = serialPort.Read(buffer, bytesReceived, nBytes - bytesReceived); - if (received < 0) - throw new NotConnectedException("Serial Connection has been closed"); + do + { + //Console.WriteLine($"🔧 Waiting for {nBytes} bytes..."); + var received = serialPort.Read(buffer, bytesReceived, nBytes - bytesReceived); + //Console.WriteLine($"✅ Received {bytesReceived} bytes so far"); + + if (received < 0) + throw new NotConnectedException("Serial Connection has been closed"); + + bytesReceived += received; + } + while (bytesReceived < nBytes); - bytesReceived += received; } - while (bytesReceived < nBytes); + catch (TimeoutException) + { + throw new IOException("Serial read timed out"); + } return buffer; }