System.timeoutexception в system.io.ports.ошибка dll
Я написал консольную программу на C#, которая устанавливает параметры(я дал параметры из project->debug option) Я пытаюсь получить данные из ethernet и последовательного порта.
Я успешно установил параметры args, но программа получает ошибку таймаута при string filename = args[4]; (Я поставил точки останова и проследил движение стека.) Консоль открывается внезапно и действует так, как будто она находится в бесконечном цикле, но цикла нет.(ошибка возникает перед чтением в то время как) Я даже не вызываю никаких методов в то время, когда получаю эту ошибку- это не имеет смысла.
Для тех, кто хочет прочитать, что это за параметры; 1 = IP, [2] = номер порта, [3] = имя порта(COM3), [4] = имя файла.
Тайм-ауты предназначены для предотвращения потери данных, учитывая, что я могу получать данные из обоих соединений одновременно через ethernet и последовательный порт.
Также я хочу сказать добавив
DataReceived += new SerialDataReceivedEventHandler(ProcessReceivedData);вместо пока не имеет никакой пользы, так как вновь случается, прежде чем цикл while.
У кого-нибудь есть какие-нибудь идеи?
Что я уже пробовал:
public class SPWrapper { private System.IO.Ports.SerialPort CmdSerialPort; public DateTime lastComm = DateTime.MinValue; public UdpClient udpClient_Cmd; public volatile bool _enabled_Cmd; public static int Ethernet_Packet_Header_Length = 14; private IPAddress IP { get; set; } private int Cmd_Port { get; set; } private string SerialPortName; private StreamWriter swLog; private bool _closing = false; private IPEndPoint IPE_Cmd; private void CloseEthernet() { udpClient_Cmd?.Close(); } private void CloseSerialPort() { if (CmdSerialPort.IsOpen) { CmdSerialPort.Close(); } } public void Close() { _closing = true; CloseEthernet(); CloseSerialPort(); swLog = null; } private bool InitilizeSerialPort(string portName) { try { CmdSerialPort.PortName = portName; CmdSerialPort.BaudRate = 115200; CmdSerialPort.ReadTimeout = 10; // 10milisecond read timeout CmdSerialPort.Open(); if (CmdSerialPort.IsOpen) { return true; } return false; } catch (UnauthorizedAccessException e) { Debug.WriteLine(e.ToString()); Debug.WriteLine(e.Message); return false; } catch (ArgumentOutOfRangeException e) { Debug.WriteLine(e.ToString()); Debug.WriteLine(e.Message); return false; } catch (ArgumentException e) { Debug.WriteLine(e.ToString()); Debug.WriteLine(e.Message); return false; } } private bool InitializeEthernet() { bool retVal = true; IPE_Cmd = new IPEndPoint(IP, Cmd_Port); try { udpClient_Cmd = new UdpClient(); udpClient_Cmd.Client.Bind(IPE_Cmd); udpClient_Cmd.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 10); } catch (Exception ex) { retVal = false; udpClient_Cmd?.Close(); udpClient_Cmd = null; Debug.WriteLine(ex.ToString()); Debug.WriteLine(ex.Message); Debug.WriteLine(ex.InnerException?.ToString()); } return retVal; } public SPWrapper(IPAddress ip, int cmdPort, string comPort, StreamWriter sw) { IP = ip; Cmd_Port = cmdPort; SerialPortName = comPort; swLog = sw; CmdSerialPort = new SerialPort(); } public bool Init() { return (InitializeEthernet() && InitilizeSerialPort(SerialPortName)); } internal void GetMessage() { lastComm = DateTime.Now; string SerialMessage = ""; try { SerialMessage = CmdSerialPort.ReadLine(); } catch (TimeoutException) { } if (SerialMessage.Length >0) { SerialMessage = SerialMessage.Trim(' ').Trim('\n').Trim('\r'); swLog.WriteLine($"{CmdSerialPort.PortName}\t{lastComm}\t{SerialMessage}"); } IPEndPoint e = new IPEndPoint(IPAddress.Any, 0); byte[] receiveBytes = null; try { receiveBytes = udpClient_Cmd?.Receive(ref e); } catch (ObjectDisposedException) { udpClient_Cmd?.Close(); udpClient_Cmd = null; } catch(SocketException) { } if (receiveBytes != null) { string UDP_Read_Message = System.Text.Encoding.UTF8.GetString(receiveBytes.Skip(Ethernet_Packet_Header_Length).ToArray()); swLog.WriteLine($"{e}\t{lastComm}\t{UDP_Read_Message}"); } } }
Это мое главное
class Program { public static SPWrapper p; static int Main(string[] args) { int err = 0; if (args.Length == 5) { IPAddress IP = IPAddress.Parse(args[1]); int CmdPort; if (int.TryParse(args[2],out CmdPort)) { string filename = args[4];//takes filename String root = @".\\"; //DEFAULT EXE PATH ROOT string path_combined; path_combined = Path.Combine(root, filename); StreamWriter sw; try { sw = File.AppendText(path_combined); p = new SPWrapper(IP, CmdPort, args[3], sw); if (p.Init()) { while (!Console.KeyAvailable) { p.GetMessage(); Thread.Sleep(100); } p.Close(); } sw.Flush(); sw.Close(); } catch (System.IndexOutOfRangeException ex) { System.ArgumentException argEx = new System.ArgumentException("File creation failed!", ex); err = -2; throw argEx; } } else { err = -1; } } if (err!=0) { Console.WriteLine("Not Enough Arguments"); Console.WriteLine("Logger IP Port ComPort FileName"); } return err; }//end of main }