Danny96 Ответов: 1

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
    }

1 Ответов

Рейтинг:
1

phil.o

Массивы в C# основаны на нуле; это означает, что ваш фактический args массив больше похож на
[0] = IP,
[1] = port number,
[2] = port name(COM3),
[3] = filename

Попробуйте изменить строку на:

string filename = args[3];
и посмотрите, куда это вас приведет.


Danny96

Я изменил его, как со стороны кода, так и со стороны аргументов(project->debug->application arguments), я поставил пробелы между ними, давая аргументы. Я проверил, есть ли Арги.Длина == 4 теперь он все еще выполняет то же самое поведение

Danny96

когда я ставлю точки останова args имеют правильное значение, но локальные переменные, которые должны принимать эти значения из args, равны null, например string filename равен null.

phil.o

Перепроверьте свои показатели. Поскольку вы поставили точку останова, нажмите клавишу F11, чтобы выполнить построчное выполнение и найти, почему вы получаете эти результаты. Я не могу сделать этого для тебя.

Danny96

Я проследил и понял, что это догнало его ошибку "UnauthorizedAccessException"

Danny96

Я попытаюсь найти ошибку исключения я считаю что она связана с открытием и закрытием последовательного порта