#c# #wpf #exception #serial-port
Вопрос:
В настоящее время я работаю над простым приложением WPF для последовательного сбора данных с платы Arduino Mega (в настоящее время для целей тестирования, которое будет масштабироваться на другие последовательные устройства).
Окружающая среда и пакеты:
- Целевая платформа: .NET Framework 4.8, Visual Studio 2019
- SerialPortStream (автор Джейсон Керл — RJCP) версия: 2.3.1
Пожалуйста, обратите внимание, что я недавно начал играть с C# и я больше знаком с C 😉
Мое приложение выполняет поиск и заполняет последовательные порты, присутствующие на моем компьютере, в списке при загрузке, затем я должен выбрать нужный порт из списка и открыть его кнопкой. Его обратный вызов настраивает SerialPortStream
объект.
После успешного выбора порта, как показано на изображении консоли ниже, на консоль выводится следующее исключение, и приложение просто зависает:
Поэтому я решил вставить точку останова в начале своего кода, чтобы проверить свой USBPort
объект, и объект показывает ошибки в Length
Static Members
Position
свойствах и. Проверка одного и того же объекта ( USBPort
) в методе, в котором настроен, показывает те же ошибки
Краткий фрагмент моего основного кода приложения выглядит следующим образом (строки, отмеченные ( * ), представляют мои вставленные точки останова для отладки):
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. Для всех, кто интересуется этим конкретным случаем, я вернусь сюда и опубликую решение, как только оно у меня будет, с помощью Джейсона. 😉