Вот — простейший пример проблемы:
Простейший код C#, открывающий соединение COM-порта.
Код: Выделить всё
internal static class Program
{
private static SerialPortStream _serialPort;
static void Main()
{
_serialPort = new SerialPortStream("COM6", 9600, 8, Parity.None, StopBits.One);
_serialPort.Open();
}
}
Код: Выделить всё
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() внутри разных Task и BackgroundWorker, в обоих случаях, даже если приложение не зависло, я не могу закрыть приложение, пока не перезагрузлю плату через встроенный переключатель.
- Я знаю, что могу «исправить» это в коде Arduino, но суть этого вопроса в том, чтобы иметь возможность обрабатывать такой случай в приложении C# (например, вы не всегда будете создателем любого модуля, которым вы обладаете). Я не думаю, что простая плата должна перестать контролировать хост.
Подробнее здесь: https://stackoverflow.com/questions/791 ... rduino-boa