Сообщение, полученное через событие Serialport Received, отличается, когда приложение запускается не в среде IDE, а из исполняемого файла. - PullRequest
0 голосов
/ 18 июня 2020

В настоящее время я разрабатываю приложение в Visual Studio 2017 с C#. При разработке моего приложения все работало нормально. Я использую класс Serialport для записи символа на устройство COM-порта и получения текста с несколькими строками назад. Даже после нескольких попыток ошибок не было! Теперь я хотел выпустить свое приложение и решил, что связь не работает, когда я запускаю его, просто выполняя сгенерированный исполняемый файл. Либо поступает только первая строка, либо две первые строки отсутствуют. Я даже видел, что первая строка появилась в конце сообщения. Я действительно сбит с толку, поскольку он работает безупречно, когда я запускаю проект через свою IDE (нажав кнопку запуска). Я не использую оптимизацию кода в своем проекте, и проблема возникает независимо от того, запускаю ли я исполняемый файл в моей отладке или в папке Release. Есть ли что-то, чего мне не хватает, что IDE делает дополнительно при запуске проекта (что может быть причиной этой ошибки)?

Вот мой код для связи через Serialport:

    public bool? OpenConnection(ComPort port)
    {
        if (_serialPort.IsOpen)
        {
            return null;
        }
        _currentComPort = port.PortName;
        _serialPort.PortName = _currentComPort;
        _serialPort.DataReceived += new SerialDataReceivedEventHandler(PublishSerialportResponse);
        Logger.LogMessage(logLevel.Debug, "Callback is logged.");
        _serialPort.Open();
        Logger.LogMessage(logLevel.Debug, "Serialport is open");
        return _serialPort.IsOpen;
    }

    private void PublishSerialportResponse(object sender, SerialDataReceivedEventArgs e)
    {
        lock (locker)
        {
            Thread.CurrentThread.Name = $"Response from {_currentComPort}";
            Logger.LogMessage(logLevel.Debug, $"");
            SerialPort sp = (SerialPort)sender;
            string mspResponse = sp.ReadExisting();
            Logger.LogMessage(logLevel.Debug, $"SerialPort received: \n{mspResponse}");
            Logger.LogMessage(logLevel.Debug, $"SerialPort Bytes left to read: {sp.BytesToRead}");
            if (responseRecived != null)
            {
                responseRecived(true, mspResponse);
            }
        }
    }

В логах сообщения появляются в неправильном порядке, как описано выше. Также есть 0 BytesToRead. Заранее спасибо.

ОБНОВЛЕНИЕ: С помощью Wireshark я выяснил, что событие Received запускается слишком рано. Каждая строка текста ответа представляет собой один URB_BULK, и ReadExisting начинается слишком рано, чтобы получить полное сообщение. Когда я снова открываю порт, он сначала захватывает остатки последнего сообщения, затем отправляет мое сообщение, а затем снова захватывает только первую строку полученного сообщения. Странно то, что этого не происходит, если я запускаю приложение из своей IDE. Так что мой вопрос остается .... Почему ?? : D

...