2014-12-22 5 views
2

Я студент-инженер, и я в настоящее время работаю над своим проектом в прошлом году. Я пытаюсь построить систему управления парковками на основе rfid на C#. основанный на некоторых исследованиях, я написал следующий код для чтения данных из читателя 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

Что такое входящие данные? Глядя на ваш код, я замечаю у вас есть линия

RFID.DataBits = 8;

В .NET полукокса 2 байта. Если вы читаете символ с вашего устройства, тогда на самом деле вам нужно будет дважды вызвать обработчик событий для обработки всех 16 бит. Можете ли вы изменить значение на 16?

1

Установите точку прерывания по методу RFID_DataReceived, чтобы узнать, почему он стреляет дважды. Затем вы можете посмотреть окно стека, чтобы увидеть трассировку стека кода.

Вы также можете сделать то же самое для оригинального метода Parking_layout_Load, чтобы узнать, может ли он быть вызван более чем один раз из другого фрагмента кода. Вы также можете поместить код внутри функции, чтобы стек был записан в окно вывода.

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 как в этом примере: StackTrace Class

Environment.StackTrace Property

How to: Use the Call Stack Window

Смежные вопросы