2013-07-21 7 views
2

RFID를 사용하는 등록 시스템과 같은 프로젝트가 있습니다. 사용자가 등록 모드를 사용할 때, 표시된 각 카드는 한 번만 저장해야합니다. 이를 위해 배열을 사용하고 배열에있는 동일한 코드를 검사하여 이미 존재하는지 확인합니다. 하지만 배열 인덱스를 늘리는 데 문제가 있습니다. 내가 plIndex를 사용하는 경우, 그것은 첫 번째 카드를 받아 다시이 핸들러를 호출 중지 것 같아, 아래의 코드에서직렬 포트에서 다른 값만 수신

string rx_data = ""; 
string last_data = ""; 
string[] availablePlayers = {""}; 
int plIndex = 0; 

: Form1 클래스에

, 나는 초기화가 있습니다.

public void WriteRxData(object sender, SerialDataReceivedEventArgs e) 
    { 
     if (connection.IsOpen && !cardSaveCon.IsOpen) 
     { 
      try 
      { 
       rx_data = connection.ReadLine(); // check how the data ends 
       if (!availablePlayers.Any(rx_data.Contains)) 
       { 
        availablePlayers[plIndex] = rx_data; 
        receivedData.AppendText(rx_data); 
        plIndex++; 
       } 

      } 
      catch (Exception err) 
      { 
       connection.Close(); 
      } 
     } 

대신 하드 코딩 된 색인 값을 사용하면 작동합니다. 다른 언어에서도 작동해야하므로이 문제를 어떻게 처리해야하는지 알고 싶습니다. 나는 C#에 익숙하지 않아 내가 놓친 부분이있을 수있다.

답변

1
availablePlayers[plIndex] = rx_data; 

두 번째로 문자열을받는 경우 코드가 충돌합니다. 아쉽게도 IndexOutOfRangeException을 잡아 포트를 닫습니다. 어떤 코드가 완전히 교착 상태가 될지, SerialPort.Close()는 이벤트 핸들러가 반환 된 경우에만 완료 할 수 있습니다.

구체적인 대응책 :

  • 이 코드에서 대신 문자열 []
  • 제거 시도/캐치의 List<string>를 사용, 그것은 지금까지 아무것도 할 수 있지만 프로그램을 만들 수 없습니다 복구 할 수있는 방법없이 실패
  • 예기치 않은 예외가 발생할 때 프로그램이 종료 될 때 AppDomain.CurrentDomain.UnhandledException 이벤트 처리기를 작성하여
  • 디버거 + Windows + 스레드 디버거 창에 익숙해집니다. 다른 스레드에서 무슨 일이 벌어지고 있는지 알 수 있습니다. 교착 상태를 보았을 것입니다.
+0

질문 btw에 대한 칭찬은 잘 문서화했으며 도움을 쉽게했습니다. –

+0

도움을 주셔서 감사합니다,하지만 왜 여기에 OutOfRange에 대해 불평하는지 이해할 수 없습니다. 'savedCards.AppendText (last_data + "= \ n");' – www

+0

. 내가 추천 한대로 try/catch를 제거하여 예외가 던져지는 곳을 확인하십시오. 그런 다음 availablePlayers 배열의 문제도 확인해야합니다. * one * 요소를 가지고 있으므로 두 번째 요소를 설정하려고하면 klaboom이 발생합니다! –

관련 문제