Я пишу программу на C#, которая отправляет несколько простых команд в Arduino. через последовательный виртуальный порт USB.
Иногда случается, что программа зависает, даже если код защищен блоком try / catch.
Когда я увидел проблему, похоже, проблема в закрытии порта.
Функция очень проста:
void Send() {
try {
Debug.WriteLine("SR1 "+rel+" "+status);
_serialArduino.Open();
Debug.WriteLine("SR2");
_serialArduino.WriteLine(string.Format("switch {0} {1}\n", rel, Convert.ToSByte(status)));
Debug.WriteLine("SR3 '"+_serialArduino.ReadLine()+"'");
_serialArduino.Close();
Debug.WriteLine("SR4");
Thread.Sleep(400);
} catch (Exception e) {
LogManager.Write(string.Format("ERR SwitchRel({0}, {1}) - {2}", rel, status, e.Message));
}
}
Я прочитал о проблеме во время выполнения функции Close, но в этом случае обработчик события DataReceived не определен (== null).
Любая идея?
* Отредактировано, чтобы добавить некоторые детали *
После нескольких дней отладки и анализа журналов я обнаружил следующее:
Я предполагаю, что драйвер usbser в беспорядке. Единственное решение, пока что это сброс платы. Есть ли способ сбросить драйвер без перезагрузки и проверить, возвращается ли он в известное состояние? А может DotNet Framework не определяет порт?
Это было сделано до редактирования темы. Об ошибках сообщалось, когда я модифицировал исходный код, чтобы открыть порт в начале и закрыть в конце приложения.
Возможно, стоит попробовать открыть порт при запуске приложения и оставить его открытым все время.