В настоящее время я разрабатываю приложение в 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