RJCP.IO.Порты SerialPortsStream System.IO.IOException — Недопустимая конфигурация (Состояние прерывания, Длина, Положение)

#c# #wpf #exception #serial-port

Вопрос:

В настоящее время я работаю над простым приложением WPF для последовательного сбора данных с платы Arduino Mega (в настоящее время для целей тестирования, которое будет масштабироваться на другие последовательные устройства).

Окружающая среда и пакеты:

  • Целевая платформа: .NET Framework 4.8, Visual Studio 2019
  • SerialPortStream (автор Джейсон Керл — RJCP) версия: 2.3.1

Пожалуйста, обратите внимание, что я недавно начал играть с C# и я больше знаком с C 😉

Мое приложение выполняет поиск и заполняет последовательные порты, присутствующие на моем компьютере, в списке при загрузке, затем я должен выбрать нужный порт из списка и открыть его кнопкой. Его обратный вызов настраивает SerialPortStream объект.

Окно захвата из списка выбора последовательных портов

После успешного выбора порта, как показано на изображении консоли ниже, на консоль выводится следующее исключение, и приложение просто зависает:

Результаты просмотра окна для объекта USBPort

Поэтому я решил вставить точку останова в начале своего кода, чтобы проверить свой USBPort объект, и объект показывает ошибки в Length Static Members Position свойствах и. Проверка одного и того же объекта ( USBPort ) в методе, в котором настроен, показывает те же ошибки

Окно просмотра, показывающее неверную конфигурацию порта USB

Краткий фрагмент моего основного кода приложения выглядит следующим образом (строки, отмеченные ( * ), представляют мои вставленные точки останова для отладки):

 using RJCP.IO.Ports;
using System;  
// ... and others

myApp{

    public partial class MainWindow: Window {
    
    private string ComPortName;
    private int BaudRate;
    private SerialPortStream USBPort = new SerialPortStream();
    // ... plus other declarations
    
    public MainWindow(){

        InitializeComponent();

        (*) BaudRate = 115200;    // Inserted a breakpoint here to inspect USBPort in the debugger
    }

    // Start communication Callback/Binding --> Connect button Click binding
    private void StartCOM_Click(object sender, RoutedEventArgs e){

        try{
            
            (*) USBPort = new SerialPortStream(ComPortName, BaudRate);
            USBPort.Open(); // Inserting a breakpoint here shows the same errors in the watch window

            // ...subsequent actions


        } catch(Exception ex){
             if(ex is IOException){

                 throw new IOException("Unable to create serial port");  // Message does NOT get displayed
             
             }

        } 
}
 

Пожалуйста, обратите внимание, что мой подход РАБОТАЛ просто отлично, и я мог читать строки из последовательного порта. Что-то сломалось после того, как я переработал некоторые части своего кода, НЕ связанные с SerialPortStream объектом. Я даже попробовал использовать старую версию своего кода, и теперь он каждый раз выдает одну и ту же ошибку.

  • Правильно ли я предварительно объявляю свой USBPort объект с помощью пустого конструктора, а затем настраиваю его внутри обратного вызова?
  • Что такое «указанный метод», на который Length ссылается свойство?
  • Сильно ли библиотека dll RJCP зависит от используемой платформы? Согласно репозиторию GitHub, в версии 4.8 он должен работать нормально.
  • Связаны ли различные версии Windows 10 с этой проблемой? Мой код вчера отлично работал на моем ноутбуке на работе, а не на домашнем компьютере. (На данный момент у меня нет доступа к этому ноутбуку).
  • Должен ли я вернуться к предыдущим версиям пакета RJCP?

Спасибо вам, ребята

Ответ №1:

Рассмотрение ваших индивидуальных вопросов:

  • Правильно ли я предварительно объявляю свой объект USBPort с помощью пустого конструктора, а затем настраиваю его внутри обратного вызова?
    • ДА. Это прекрасно. Они просто свойства, пока порт не будет открыт()ред.
    • Но предоставленный вами фрагмент кода игнорирует это, потому что в StartCOM_Click любом случае вы создаете новый экземпляр SerialPortStream . Убедитесь, что вы не открывали один и тот же порт дважды, что может привести к конфликту ресурсов (Windows не позволяет открывать один и тот же последовательный порт из одного или нескольких приложений более одного раза).
  • Что такое «указанный метод», на который ссылается свойство Length?
    • Свойство Length и Position не определено, что CanSeek свойство находится false в данной конкретной реализации.
  • Сильно ли библиотека dll RJCP зависит от используемой платформы? Согласно репозиторию GitHub, в версии 4.8 он должен работать нормально.
    • Использование пакета 2.3.1 содержит библиотеки для .NET 4.0, .NET 4.5 и .NET Standard 1.5. Менеджер пакетов NuGet должен выбирать скомпилированную версию .NET 4.5 при запуске поверх .NET 4.8, которая описывается поддержкой нескольких целевых платформ.
    • вы можете подтвердить это, проверив библиотеку RJCP.SerialPortStream.dll , указанную рядом с вашей скомпилированной программой. Просто проверьте размеры. Размер версии .NET 4.5 составляет 233 КБ, стандартная версия .NET-246 КБ.
    • Вы, вероятно, знаете, что сама среда выполнения, если у вас установлена .NET 4.8, является обновлением с высокой совместимостью для всех других версий. Таким образом, программное обеспечение, предназначенное для .NET 4.5 или .NET 4.8, работает по существу с одним и тем же кодом (я говорю по существу, потому что у MS есть некоторые проверки совместимости, но они здесь неуместны).
  • Связаны ли различные версии Windows 10 с этой проблемой? Мой код вчера отлично работал на моем ноутбуке на работе, а не на домашнем компьютере. (На данный момент у меня нет доступа к этому ноутбуку).
    • Более вероятно, что это связано с самим водителем, которому что-то не нравится в частности. К сожалению, из приведенного описания трудно сказать, что именно. Чтобы отладить это, лучше всего отслеживать в выпуске GitHub.
  • Должен ли я вернуться к предыдущим версиям пакета RJCP?
    • Было исправлено несколько ошибок и т. Д., Но здесь не описано ничего, что указывало бы на то, что это имело бы значение.

Комментарии:

1. Дорогой Джейсон. Большое вам спасибо за исчерпывающий ответ. Я могу подтвердить, что я открыт()в порту только один раз с помощью кнопки(). Действительно, точка отказа, похоже, находится в методе Open () (опять же, только на ПК Ryzen). Давайте продолжим разговор на GitHub, если вы согласны (и если администраторы СОВФ согласны)

2. Для всех, кто интересуется этим конкретным случаем, я вернусь сюда и опубликую решение, как только оно у меня будет, с помощью Джейсона. 😉