2014-12-22 2 views
2

저는 엔지니어링 학생이며 현재 최종 학년 프로젝트를 진행 중입니다. 나는 C#에서 rfid 기반 주차장 관리 시스템을 구축하려고합니다. 몇 가지 연구를 기반으로 내가 rfid 리더에서 데이터를 읽는 다음 코드를 작성했지만이 문제에 직면하고있다. 이벤트 처리기
내가받은 데이터를 두 번 읽는 데 사용하는 방법을 이해하지 못하는 ... 나는 인터넷에 대한 조사를 한 결과 많은 사람들이 두 번이나 해고하는 이벤트 처리기와 비슷한 문제에 직면하고 있음을 발견했습니다. 그것들은 버튼 클릭 이벤트입니다. 나는 단지 사용자 정의 이벤트 처리기에서 몇 가지 스레드를 찾을 수 있지만 그 솔루션은 내 프로젝트에서 작동하지 않는 것. 이 문제에 대한 가능한 해결책은 무엇입니까?이벤트 처리기가 두 번 발생합니다.

private void Parking_layout_Load(object sender, EventArgs e) 
{ 
    foreach (string port in System.IO.Ports.SerialPort.GetPortNames()) 
    { 
     comboBox1.Items.Add(port); 
     if (comboBox1.Items.Count > 0) 
      comboBox1.SelectedIndex = comboBox1.Items.Count - 1; 
    } 

    RFID = new SerialPort(); 
    RFID.PortName = comboBox1.Text; 
    RFID.BaudRate = 9600; 
    RFID.DataBits = 8; 
    RFID.Parity = Parity.None; 
    RFID.StopBits = StopBits.One; 
    RFID.Open(); 
    RFID.DataReceived += new SerialDataReceivedEventHandler(RFID_DataReceived); 

} 

private void RFID_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{    
    try 
    {     
     tag_id = RFID.ReadExisting().ToString();    
     SetLabel(tag_id);     
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message); 
    } 
} 

RFID_DataReceived가 두 번 실행됩니다. 테스트하기 위해 messageBox.show() 문을두면 메시지가 두 번 표시됩니다. 이 문제를 어떻게 해결합니까?

+0

장치를 가지고 있지 이상의 데이터 조각을 보내? 이것은 매우 하드웨어 종속적 인 질문처럼 보입니다. –

+6

'catch' 블록을 제거해야합니다; 그것이하는 일은 정보를 파괴하는 것뿐입니다. – SLaks

+2

동일한 데이터입니까? –

답변

-1

들어오는 데이터는 무엇입니까? 코드를 보면, 나는 문자가 2 바이트, 당신은 라인 .NET에서

RFID.DataBits = 8;

을 알 수 있습니다. 장치에서 캐릭터를 읽는다면 실제로 모든 16 비트를 처리하기 위해 이벤트 처리기를 두 번 호출해야합니다. 값을 16으로 바꿀 수 있습니까?

1

RFID_DataReceived 메서드에서 중단 점을 설정하여 두 번 발사되는 이유를 확인합니다. 그런 다음 스택 창을보고 코드의 스택 추적을 볼 수 있습니다.

원래 코드 인 Parking_layout_Load에서도 동일한 코드를 사용하여 다른 코드에서 한 번 더 호출되고 있는지 확인할 수 있습니다. stacktrace가 출력 창에 쓰여지도록 함수 내에 코드를 배치 할 수도 있습니다. 더 많은 세부 사항에 대한

private void RFID_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ Debug.WriteLine("StackTrace: '{0}'", Environment.StackTrace);   
    try 
    {     
     tag_id = RFID.ReadExisting().ToString();    
     SetLabel(tag_id);     
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message); 
    } 
} 

는이 예에서와 같이 스택 트레이스 클래스를 사용 StackTrace Class

Environment.StackTrace Property

How to: Use the Call Stack Window

관련 문제