2012-11-07 63 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,如果你想重用现有的实例后。