2

私は FEZ ボード (これは問題ではないと思います) を持っており、シリアル ポートを介して通信しています。COM ポートを開いてデータを書き込む WPF アプリケーションを作成しました。これはすべてうまくいきますが、データをランダムな回数 (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();
    }

変なことをしているとは思いません。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);            
        }
    }

しかし、デスクトップ側にもっと関係があると感じています。

4

2 に答える 2

5

それはあなたのシリアルポートの問題のように私には見えます。USBはかなり信頼性が低く、USBシリアルポートはひどく信頼性がありません。別のドライバーを使用して改善したり、別のUSBポートに貼り付けたり、別のブランドのUSBアダプターを入手したり、理想的にはPCIカードに交換したりできる場合があります。

于 2012-03-17T14:30:59.763 に答える
1

不安定な USB-Serial アダプタ (他に種類はないと思います) と .NET のやや不安定な SerialPort 実装が組み合わされているように思えます。.NET は、シリアル ポートが突然失われるとうまく対処できません。

こちらをご覧ください

過去に、すべてのシリアル ポート通信を別のプロセスに取り込んで、アプリケーションの残りの部分を強制終了せずに強制終了して再起動できるようにしました。

于 2012-03-17T15:20:00.017 に答える