我有一个通过rs232读取不同硬件的应用程序。它已经过测试,并且运行良好。对于最终应用,我需要引入几根长于munder的电缆,这意味着我具有rs485转换器。
当我运行应用程序以读取硬件时,出现System.IO.Ports.SerialStream.Read超时错误。我已将超时时间增加到20秒,但是它没有解决问题
我尝试了各种应用程序来读取硬件,即使读取频率为1秒,它们也可以正常工作。
通信使用的是modbus协议(protocol),由于我目前还没有到达接收任何内容的阶段,因此我认为这与当前阶段无关。
我的代码如下所示:
首先打开并初始化串口:
//get the right modbus data structure element
ModBus MB = (ModBus)s[0].sensorData;
//set up the serial port regarding the data structure's data
SerialPort sp = new SerialPort();
sp.PortName = MB.portName;
sp.BaudRate = Convert.ToInt32(MB.baudRate);
sp.DataBits = MB.dataBits;
sp.Parity = MB.parity;
sp.StopBits = MB.stopBits;
//Set time outs 20 sec for now
sp.ReadTimeout = 20000;
sp.WriteTimeout = 20000;
//将端口添加到可由读者访问的列表中
portList.Add(sp);
sp.Open();
读取硬件:
//get the right port for com
SerialPort sp = getRightPort();
ModBus MB = getRightModBusStructureelement();
try
{
//Clear in/out buffers:
sp.DiscardOutBuffer();
sp.DiscardInBuffer();
//create modbus read message
byte[] message = createReadModBusMessage();
try
{
sp.Write(message, 0, message.Length);
// FM.writeErrorLog output included for easier debug
FM.writeErrorLog(DateTime.Now + ": ModBus Message Sent");
FM.writeErrorLog(DateTime.Now + ": Read TimeOut = " + sp.ReadTimeout + " Write TimeOut = " + sp.WriteTimeout);
int offset = 0, bytesRead;
int bytesExpected = response.Length;
FM.writeErrorLog(DateTime.Now + ": start read");
while (bytesExpected > 0 && (bytesRead = sp.Read(response, offset, bytesExpected)) > 0)
{
FM.writeErrorLog(DateTime.Now + ": read - " + offset);
offset += bytesRead;
bytesExpected -= bytesRead;
}
}
catch (Exception err)
{
Console.WriteLine("ERROR Modbus Message to serial port ModBus: " + err);
FM.writeErrorLog(DateTime.Now + " - " + "ERROR Modbus Message to serial port ModBus: " + err);
}
}
在尝试了该应用程序之后,我从ErroLog.txt获得了以下输出:
14/01/2016 17:18:17: ModBus Message Sent
14/01/2016 17:18:17: Read TimeOut = 20000 Write TimeOut = 20000
14/01/2016 17:18:18: start read
14/01/2016 17:18:38 - ERROR Modbus Message to serial port ModBus: System.TimeoutException: The operation has timed out.
at System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count, Int32 timeout)
at System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count)
at System.IO.Ports.SerialPort.Read(Byte[] buffer, Int32 offset, Int32 count)
at ProbReader.SensorReader.modbusReading(List`1 mm, Int32 spCounter)
14/01/2016 17:18:38: 0
14/01/2016 17:18:38: 0
我已将超时增加到60秒,以防万一但出现相同的错误:
15/01/2016 11:11:51: ModBus Message Sent
15/01/2016 11:11:51: Read TimeOut = 60000 Write TimeOut = 60000
15/01/2016 11:11:51: start read
15/01/2016 11:12:51 - ERROR Modbus Message to serial port ModBus: System.TimeoutException: The operation has timed out.
at System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count, Int32 timeout)
at System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count)
at System.IO.Ports.SerialPort.Read(Byte[] buffer, Int32 offset, Int32 count)
at ProbReader.SensorReader.modbusReading(List`1 mm, Int32 spCounter)
15/01/2016 11:12:51: 0
15/01/2016 11:12:51: 0
我尝试了几种读取串行端口的方法,我认为当前方法看起来最好,这是我的读取代码中的while循环。
我没有包括我的其余代码,因为它之前已经超时,我认为这是不相关的。
最佳答案
如果您使用数百米的串行电缆(这本身就是硬件工程问题),那么我强烈建议在电缆的两端都安装合适的收发器。电缆本身应采用EMC屏蔽并具有高品质。长时间使用非屏蔽电缆可能会引起感应电压波动,从而可能损坏非长期使用的设备。
即使使用了良好的电缆,您仍然会有相当大的压降和电感/电容效应,可能会阻止更高波特率的通信。以您可以摆脱的最低波特率运行。
关于c# - 长电缆超时时,串行通信超时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34810718/