2

FEZ 보드 (필자는이 문제가 아닌 것 같습니다)와 직렬 포트를 통해 통신하고 있습니다. COM 포트를 열고 데이터를 쓰는 WPF 응용 프로그램을 만들었습니다. 이 모든 것이 효과적이지만 데이터를 임의의 시간 (가끔 3, 때로는 4)으로 보내면 포트를 쓰려고 시도 할 때 "시스템에 연결된 장치가 작동하지 않습니다"라는 예외가 발생합니다. 다시 시도하거나이 예외가 발생하면 포트를 닫으십시오. "포트에 대한 액세스가 거부되었습니다."라는 메시지가 나타납니다. 프로그램을 다시 시작하면 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 PC에서 작업하고 있다고 언급하는 것을 잊어 버렸습니다. 직렬 포트 통신이 아직 모든 것이 아니라고 생각합니다. . 내가 지금 Windows 7에서 시도, 위대한 작품, 더 이상 직렬 포트의 연결이 끊어졌습니다 – YentheO

+0

난 단지 FTDI 칩 기반의 USB 시리얼 변환기를 사용하고 아무 문제가 없었어요. FTDI는 제조업체가 공급하는 드라이버에 달려 있다고 생각합니다. FTDI는 아주 좋은 드라이버를 제공합니다. 그들이 서명했다면 더 좋아질 것입니다. 그것은 운전자를 진지하게 생각하는 사람의 좋은 예이며 MS가 자신의 물건에 서명하거나 심지어 WHQL을 힘들게 보내는 이유입니다. –

1

.NET의 약간 벗겨지기 쉬운 SerialPort 구현과 결합 된 비정상적인 USB 직렬 어댑터 (다른 종류는 없다고 생각합니다)처럼 들립니다. .NET은 실제로 직렬 포트의 갑작스런 손실에 잘 대처하지 못합니다. 내가 별도의 프로세스로 모든 시리얼 포트 통신을 복용의 범위에 갔어요 과거

See here

그냥 그래서 난 내 응용 프로그램의 나머지 부분을 죽이지 않고 그것을 죽이고 다시 시작 할 수있을 것 .

관련 문제