У меня есть совет 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);
}
}
Но я это чувство, что это больше связано со стороной рабочего стола.
USB-драйверы известны тем случаем такого рода проблем. Попробуйте найти обновление, выбросьте его и попробуйте другой, если это не отключится. –
@ HansPassant: Я согласен с этим. Я получил обновленные драйверы от FTDI (http://www.ftdichip.com/), и это значительно улучшило надежность моего USB/последовательного адаптера. –