2

У меня есть совет FEZ (я не думаю, что это имеет значение), и я общаюсь с ним через последовательный порт. Я сделал приложение WPF, где я открываю COM-порт и записываю данные по нему. Все это работает отлично, но после отправки данных случайное количество раз (иногда 3, иногда 4), я получаю исключение, говорящее: «Устройство, подключенное к системе, не работает» в методе Write порта, когда я пытаюсь отправить снова или попытаться закрыть порт после этого исключения, я получаю «Доступ к порту отрицается». Когда я перезапускаю программу, я получаю ту же ошибку в методе Open (что логично). Когда я просто отсоединяю USB, который представляет последовательный канал и снова подключается, я могу снова использовать порт.Последовательный доступ через SerialPort

Вот мой код:

SerialPort port = new SerialPort("COM10", 9600); 
    public MainWindow() 
    { 
     InitializeComponent(); 
     port.Open(); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     SendMessage("Relay1On\r\n"); 
    } 

    private void button2_Click(object sender, RoutedEventArgs e) 
    { 
     SendMessage("Relay1Off\r\n"); 
    } 

    private void SendMessage(string message) 
    { 
     try 
     { 
      port.Write(message); 
     } 
     catch (Exception exc) 
     { 
      listbox1.Items.Add(exc.Message); 
     } 
    } 

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     port.Close(); 
    } 

Я не думаю, что я делаю что-то странное. код, который работает на Совете СЭЗ заключается в следующем:

private Gadgeteer.Interfaces.DigitalOutput _relay; 

    void ProgramStarted() 
    { 
     try 
     { 
      usbSerial.Configure(9600, GT.Interfaces.Serial.SerialParity.None, GT.Interfaces.Serial.SerialStopBits.One, 8); 
      usbSerial.SerialLine.LineReceivedEventDelimiter = "\r\n"; 
      usbSerial.SerialLine.AutoReadLineEnabled = true; 
      usbSerial.SerialLine.ReadTimeout = GT.Interfaces.Serial.InfiniteTimeout; 
      usbSerial.SerialLine.LineReceived += new GT.Interfaces.Serial.LineReceivedEventHandler(SerialLine_LineReceived); 
      usbSerial.SerialLine.Open(); 
      _relay = eBlockExpansion.SetupDigitalOutput(GT.Socket.Pin.Nine, false); 
     } 
     catch (Exception exc) 
     { 
      throw exc; 
     } 
    } 

    void SerialLine_LineReceived(GT.Interfaces.Serial sender, string data) 
    { 
     if (data == "Relay1On") 
     { 
      _relay.Write(true); 
     } 
     else if (data == "Relay1Off") 
     { 
      _relay.Write(false);    
     } 
    } 

Но я это чувство, что это больше связано со стороной рабочего стола.

+1

USB-драйверы известны тем случаем такого рода проблем. Попробуйте найти обновление, выбросьте его и попробуйте другой, если это не отключится. –

+0

@ HansPassant: Я согласен с этим. Я получил обновленные драйверы от FTDI (http://www.ftdichip.com/), и это значительно улучшило надежность моего USB/последовательного адаптера. –

ответ

5

Это похоже на проблему с вашим последовательным портом. USB довольно ненадежный, а последовательные порты USB ужасно ненадежны. Вы можете улучшить ситуацию с помощью другого драйвера или вставить его в другой порт USB, получить другой бренд USB-адаптера или в идеале заменить его на PCI-карту.

+0

Похоже, что большинство людей здесь были правы, это как-то связано с драйверами или с определенными ошибками в использовании окон, я забыл упомянуть, что я работал на компьютере с Windows 8, я думаю, что связь с последовательным портом еще не все , Я пробовал на Windows 7, отлично работает сейчас, больше нет разъединений последовательного порта. – YentheO

+0

Я использовал только последовательные преобразователи на базе USB на основе FTDI и никогда не испытывал никаких проблем с ним. Я думаю, это зависит от того, какой производитель поставит производитель, и насколько я знаю, FTDI предлагает очень хорошие драйверы. Если они подписаны, еще лучше. Это хороший пример того, кто серьезно относится к своим драйверам, и поэтому MS делает подписывание ваших собственных вещей или даже быстрое тестирование WHQL. –

1

Звучит как сломанный USB-последовательный адаптер (я не думаю, что есть какой-либо другой вид) в сочетании с небольшой flaky-реализацией SerialPort .NET. .NET действительно не справляется с внезапной потерей последовательного порта.

See here

В прошлом я пошел в меру принимать все последовательного порта связи в отдельный процесс, чтобы убедиться, что я смогу убить его и перезапустить его, не убивая остальную часть моего приложения ,