Я пишу программу на 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).
Есть идеи?
* Отредактировано для добавления некоторых деталей *
После нескольких дней отладки и анализа журнала я обнаружил следующее:
- Я работаю на устройстве под управлением Win7Embedded Standard
- Приложение написано на C #
- через некоторое время (или может быть вызвано чем-то неизвестным до сих пор) порт, соединяющий Arduino, исчез из списка перечисленных портов
- программа сначала сообщает в моем журнале сообщения «Устройство отключено», а затем сообщения «Порт COM9 не существует»
- Диспетчер устройств сообщает COM9 в дереве «Порты» (!!)
- Если я закрою программу и перезапущу ее, она выдаст сообщение «COM9 не существует», а если я перечислю порты, COM9 не появится
Я предполагаю, что драйвер usbser в беспорядке.
Пока единственное решение - сбросить плату.
Есть ли способ перезагрузить драйвер без перезагрузки и проверить, возвращается ли он в известном состоянии?
Или, может быть, DotNet Framework, который не определяет порт?