2012-11-07 3 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은 직렬 포트를 엽니 다.

현재 프로세스 또는 시스템의 다른 프로세스가 이미 지정된 COM 포트 중 하나하여 SerialPort 인스턴스에 의해 또는 열이 : 그래서 documentation 상태 UnauthorizedAccessException가 발생 될 수있는 때 Open 호출에 예외가 있다고 가정 비 관리 코드입니다. 작업을 완료하거나 기존 인스턴스를 재사용 할 경우 IsOpen를 사용 후

그래서 당신을위한 솔루션은 CloseDisposesp이다.

관련 문제