C # зависает при закрытии соединения с Arduino - PullRequest
0 голосов
/ 07 сентября 2018

Я пишу программу на 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, который не определяет порт?

...