2012-03-17 52 views
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(); 
    } 

私は奇妙な何かをやっているとは思いません。 以下れるFEZボード上で実行されているコード:

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のバグの実装だ。私はWindows 8 PCで作業していたことを忘れていた。シリアルポートの通信はまだすべてではない。私はWindows 7で試してみましたが、現在はうまくいっています。シリアルポートの切断もなくなりました – YentheO

+0

私はFTDIチップベースのUSBシリアルコンバータだけを使用しており、問題は一度もありませんでした。私はそれが製造元が提供するドライバーに依存していると思います。私が知る限り、FTDIは非常に優れたドライバーを提供しています。もし彼らが署名していれば、さらに良い。それはドライバーを真剣に受け入れる人の良い例です。だからこそMSはあなた自身のものに署名したり、WHQLを難しい人に渡したりしています。 –

1

フレークなUSBシリアルアダプター(私はそこに他の種類はないと思う)のように聞こえます。 .NETは本当にシリアルポートの突然の損失にうまく対処しません。私はちょうどので、私はそれを殺すことができて、私のアプリケーションの残りの部分を殺すことなく、それを再起動すると思います別のプロセスにすべてのシリアルポートの通信を取るの範囲で行ってきた過去に

See here

関連する問題