Доступ к SerialPort запрещен через некоторое время - PullRequest
2 голосов
/ 17 марта 2012

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

Вот мой код:

    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);            
        }
    }

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

Ответы [ 2 ]

5 голосов
/ 17 марта 2012

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

1 голос
/ 17 марта 2012

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

См. Здесь

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

...