2012-11-07 96 views
0

我有幾個窗口的應用程序(實際上它的兩個幾乎與一些功能相同的窗口)。其中一項功能是從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; 
} 

任何人都可以幫助嗎? ;)

+0

關閉窗口時是否關閉端口? –

+0

您不能共享串行端口。當窗口關閉並在另一個窗口中再次打開時關閉SerialPort也非常麻煩。此處的最佳做法是將與SerialPort一起使用的代碼分離到一個單獨的類中,並且只有該類的一個實例。將數據從視圖中分離出來。 –

回答

3

方法calculateWeight_Click打開串口。所以,我認爲你得到你的例外在Open呼叫作爲documentation狀態UnauthorizedAccessException可以扔掉時:

當前進程,或系統上的其他進程,已經有指定的COM端口或者由的SerialPort實例或打開在非託管代碼中。

所以你的解決方案是CloseDisposesp你做或使用IsOpen,如果你想重用現有的實例後。