0

私はいくつかのウィンドウを持つアプリケーションを持っています(実際には、いくつかの機能を持つ2つのほぼ同じウィンドウです)。その機能の 1 つは、COM ポートからデータを読み取ることです (計量機から重量を読み取ります)。問題は、最初のウィンドウで完全に機能することですが、それを閉じて別のウィンドウを開いてから同じ機能をクリックすると(重みの計算と呼びましょう)、次のエラーメッセージが表示されます:ポート「COM1」へのアクセスが拒否されました。

コード:

   private void calculateWeight_Click(object sender, RoutedEventArgs e)
{
    sp = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
    tekst = string.Empty;
    sp.Open();
    sp.WriteLine(((char)5).ToString());
    sp.WriteLine(((char)17).ToString());
    sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
}
private delegate void UpdateUi(string s);
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    tekst += sp.ReadExisting();
    if (tekst.Contains('S') && tekst.Length > 14)
        Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUi(czytajWage), tekst);
}
string tekst = string.Empty;

void czytajWage(string s)
{
    string w = "";
    for (int i = 5; i < 14; i++)
    {
        w += s[i];
    }
    MessageBox.Show(w);
    w = "";
    tekst = "";

    sp.DataReceived -= sp_DataReceived;
}

誰でも助けることができますか?;)

4

1 に答える 1

3

メソッドcalculateWeight_Clickは、シリアル ポートを開きます。したがって、次の場合にドキュメントの状態がスローされる可能性があるため、Open呼び出し時に例外が発生すると想定しています。UnauthorizedAccessException

現在のプロセス、またはシステム上の別のプロセスは、SerialPort インスタンスまたはアンマネージ コードのいずれかによって、指定された COM ポートを既に開いています。

したがって、解決策はCloseDispose sp完了した後、またはIsOpen既存のインスタンスを再利用する場合に使用することです。

于 2012-11-07T13:38:57.170 に答える