2011-08-23 3 views
2

시리얼 포트를 통해받은 데이터를 기본 UI에서 호출하는 함수에 연결하는 방법을 알고 싶습니다.SerialPort받은 데이터를 메인 UI 스레드의 읽기 기능에 연결하는 방법?

UI에서 직렬 포트의 데이터를 보내고 스레드를 일시 중단하거나 주 UI 스레드를 계속하기 전에 직렬 포트 스레드를 통해 데이터를 수신 할 때까지 기다려주십시오.

thread.suspend()는 안전한 함수가 아니며 thread.resume과 함께 시도했지만 실패했습니다.

잠금/뮤텍스를 확인해야합니까?

또는 EventWaitHandles?

나는 완전히 혼란 스럽다! 나는 스레딩에 익숙하지 않아 도움이 될 것입니다. 고맙습니다. 당신은 UI를 차단하려는 경우

공공 정적 INT SerialCOM_Read (단위의 tRegisterAddress, 바이트 [] tRegisterValue 밖으로, UINT의 nBytes) {

 int retVal = 1; 

     tRegisterValue = new byte[nBytes]; 

    byte[] nBytesArray = new byte[4]; 

     NBytes = nBytes; 


     try { 

      ReadFunction = true; 
      YetToReceiveReadData = true; 
     byte[] registerAddress = BitConverter.GetBytes(tRegisterAddress); 

     int noOfBytesForRegAdd = 1; 

     if (registerAddress[3] > 0) noOfBytesForRegAdd = 4; 
     else if (registerAddress[2] > 0) noOfBytesForRegAdd = 3; 
     else if (registerAddress[1] > 0) noOfBytesForRegAdd = 2; 

     nBytesArray = BitConverter.GetBytes(nBytes); 
     { 

     Append_Start(); 
     Append_Operation_with_NoOfBytesForRegAdd(OPERATION.I2C_READ, noOfBytesForRegAdd); 
     Append_RegAdd(noOfBytesForRegAdd, tRegisterAddress); 
     Append_NoOfBytesOfData(nBytesArray); 

     Send_DataToWrite(); 

    //Need to Suspend Thread here and Continue once the 
    //ReadData[i] global variable has been assigned. 

    for(int i=0; i<nBytes; i++) 
tRegisterValue[i] = ReadData[i]; 
    } 
     catch(Exception ex) {} 

     return retVal; 

}

+1

코드가 컴파일되지 않거나 catch 블록이 try 블록 안에 * 유효하지 않은 구문입니다. –

+0

WPF 또는 WinForms UI를 코딩하고 있습니까? 어떤 경우 든 UI ​​스레드를 일시 중단하는 것이 좋지 않은 것처럼 보입니다. 앱에서 '반이중'통신 모드를 시행하려는 것처럼 들리지만 일반적으로 직렬 포트 클라이언트 응용 프로그램에는 필요하지 않습니다. 어쨌든 도움이 될 수있는 [링크] (http://social.msdn.microsoft.com/Forums/en/wpf/thread/faa4f9dd-db1b-46fb-8b90-f71b2836b5dc)는 다음과 같습니다. –

+0

죄송합니다. 구문이 잘못되었습니다. 코드를 잘못 잘라서 붙여 넣었습니다.} Windows Form GUI를 사용하고 있습니다. 링크를 이용해 주셔서 감사합니다! :) – Bela

답변

0

:

아래 코드 스레드를 사용하면 DataReceived 이벤트를 사용할 필요가 없습니다. 단순히 SerialPort.Read/Line()을 직접 호출하십시오. 이것이 사용자 인터페이스 반응성에서 야기 할 수있는 지연은 일반적으로 바람직하지 않지만,가는 것이 훨씬 쉽습니다.

+0

고마워요! 예, 이것이 내가 필요한 것입니다 !!! :) – Bela

0

대리자를 만들고이를 사용하여 직렬 포트에서 수신 한 데이터를 처리 할 수있는 방법으로 데이터를 보냅니다. 내 사용 사례는 포트를 통해 데이터를 보내고 병이 들었을 때 응답을 다시받는 경우를 알 수는 있지만 언제든지 가능할 수 있지만 데이터를 가져 와서 처리 할 수 ​​있어야하므로 다음을 수행해야합니다. . 이것이 당신이 원하는 것일 수도 있다고 생각하십시오

Public Delegate Sub recieveDelegate() 

Private Sub datareceived1(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPrt.DataReceived 

    buffer = buffer & SerialPrt.ReadExisting() 

    If InStr(1, rxbuff, EOF) > 0 Then 
     Rxstring = rxbuff 
     rxbuff = "" 
     BeginInvoke(New recieveDelegate(AddressOf recieveHandlingMethod), New Object() {}) 
    End If 
End Sub 

수신 처리 방법으로받는 데이터 만 처리하십시오.

+0

감사합니다 황새 치, 나는이 정보가 정말 도움이되도록 대표자를 만드는 방법을 확신하지 못했습니다! :) – Bela

관련 문제