У меня возникла проблема, о которой, похоже, никто не знает в Интернете: мое приложение Windows зависает, когда последовательное соединение прерывается внутренним исключением платы.
Вот — простейший пример проблемы: Простейший код C#, открывающий соединение COM-порта.
void loop()
{
delay(500); //We wait 0.5 seconds to allow the COM port connection to "Successfully" be established, and so the .Open() call in C# won't throw an exception.
//We create an internal exception, in this instance we try to set an array size to a negative value
int index = -4;
byte* serialData = new byte[index];
}
Это очень простой способ воссоздать эту проблему.
Некоторая полезная информация:
Я использую модуль Raspberry Pi Pico (RP2040 Zero).
RP2040 подключен через USB-C, его последовательные порты работают через USB.
Я использую RJCP.IO.Ports для связи через COM-порт на стороне C#. Я также не думаю, что это проблема библиотеки, поскольку я заметил, что терминал Visual Studio Code также зависает, когда пытается установить последовательную связь для чтения.
Я пробовал вызов метода Open() внутри другой задачи и BackgroundWorker, в обоих случаях, даже если приложение не зависло, я не могу закрыть приложение, пока не перезагрузлю плату через встроенный переключатель (я понял, что программа закроется примерно через 1 минуту после того, как я попытался закрыть его).
Я знаю, что могу «исправить» это в коде Arduino, но суть этого вопроса в том, чтобы иметь возможность обрабатывать такой случай в приложение C# (например, вы не всегда будете создателем имеющегося у вас модуля). Я не думаю, что простая доска должна перестать контролировать хост.
У меня возникла проблема, о которой, похоже, никто не знает в Интернете: мое приложение Windows зависает, когда последовательное соединение прерывается внутренним исключением платы. Вот — простейший пример проблемы: [b]Простейший код C#, открывающий соединение COM-порта.[/b] [code]internal static class Program { private static SerialPortStream _serialPort;
static void Main() { _serialPort = new SerialPortStream("COM6", 9600, 8, Parity.None, StopBits.One); _serialPort.Open(); } } [/code] [b]Код платы Arduino, который имитирует внутреннее исключение после небольшой задержки.[/b] [code]void loop() { delay(500); //We wait 0.5 seconds to allow the COM port connection to "Successfully" be established, and so the .Open() call in C# won't throw an exception.
//We create an internal exception, in this instance we try to set an array size to a negative value int index = -4; byte* serialData = new byte[index]; } [/code] Это очень простой способ воссоздать эту проблему. Некоторая полезная информация: [list] [*]Я использую модуль Raspberry Pi Pico (RP2040 Zero). [*]RP2040 подключен через USB-C, его последовательные порты работают через USB.[*]Я использую RJCP.IO.Ports для связи через COM-порт на стороне C#. Я также не думаю, что это проблема библиотеки, поскольку я заметил, что терминал Visual Studio Code также зависает, когда пытается установить последовательную связь для чтения. [*]Я пробовал вызов метода Open() внутри другой задачи и BackgroundWorker, в обоих случаях, даже если приложение не зависло, я не могу закрыть приложение, пока не перезагрузлю плату через встроенный переключатель (я понял, что программа закроется примерно через 1 минуту после того, как я попытался закрыть его). [*]Я знаю, что могу «исправить» это в коде Arduino, но суть этого вопроса в том, чтобы иметь возможность обрабатывать такой случай в приложение C# (например, вы не всегда будете создателем имеющегося у вас модуля). Я не думаю, что простая доска должна перестать контролировать хост. [/list] Спасибо всем, кто помогает!