2016-08-09 8 views
1

У меня есть проект Varsity, в котором я должен использовать RFID-ридер в фоновом режиме, чтобы отслеживать часы Employee Clock-in/out. Графические интерфейсы forformround winform имеют дело с повседневной транзакцией, такой как Заказы, котировки и т. Д. Поэтому мне нужно иметь возможность использовать программу без перерывов, одновременно отслеживая приход и уход сотрудников. Я изучил справочные работники, какой-то новый протектор и захват ввода. Но я просто не могу найти ничего, что сработает. Читатель RFID действует как клавиатура, и я могу получить его имя. используя Raw InputИспользование USB-считывателя RFID-сигнала с фоновой обработкой

RFID детали: RFID Reader Details

Чтобы уточнить, пользователь должен иметь возможность использовать программу (несколько форм) без перерыва, а любой вход от считывателя RFID должен быть записан в справочном списке.

Я новичок в фоновых рабочих, многопоточность и захват ввода, поэтому я позабочусь о некоторой подробной помощи. Также, пожалуйста, спросите, нужно ли вам больше деталей с моей стороны.

+0

У вас есть какие-то коды? Без каких-либо кодов это будет слишком широко ... –

+0

Вы уже успешно прочитали некоторые RFID-файлы на C# с помощью вашего устройства? Затем отправьте код, который вы уже пробовали. – BoeseB

ответ

0

Многопоточность не очень проста. BackgroundWorker несколько проще в графическом интерфейсе, но по-прежнему трудно получить доступ к графическому интерфейсу из фоновой задачи. Почему бы не попробовать сначала с Task/Await? Это позволяет избежать многопоточности и может выполнять две задачи.

+0

Учитывая, что он использует .NET 4.5, который поддерживает async/wait. Если он использует более ранние версии .NET, ему нужна некоторая библиотека, например AsyncBridge. Даже когда Async/wait и Task упрощают параллельное программирование, все еще многопоточность. Прежде чем использовать многопоточность для опроса RFID-считывателя, я предлагаю попробовать реагировать на Полученное событие USB-устройства, если это поддерживает USB-интерфейс USB. – BoeseB

+1

Правда. Я бы не пошел со старыми версиями .Net.Задача заняла некоторое время, чтобы получить концепции, но теперь мне это нравится намного лучше, чем реальная многопоточность. – Roland

1

RFID-считыватель, который у меня есть, у NordicID Sampo есть API, который запускает поток, который считывает данные. Вы можете использовать это, создав задачу, которая считывает данные из буфера, добавленного этим потоком. Затем вы можете передать эти данные в форму или отправить ее по электронной почте или что-то еще.

Ваш сканер, вероятно, имеет аналогичный механизм.

Пример: StartStreaming - это оболочка API-интерфейса устройства, которая запускает поток, считывающий данные устройства.

class RFIDReader : IDisposable 
    { 
     public void StartStreaming() 
     { 
      if (RFID_ConnectSerialPort(mAPIHandle, 4, 115200) == 0 || RFID_ConnectAutoUSB(mAPIHandle) == 0) 
      { 
       RFID_StartInventoryStreaming(
        (value, antenna) => { 
         mAntennas[antenna].Add(value); 
        }); 
      } 
     } 
/////// MORE FUNCTIONS 
    } 

Клиентский код, который запускает свою собственную задачу и проверки данных периодически:

static void Main(string[] args) 
{ 
    Action a = new Action(() => 
    { 
     using (RFIDReader scanner = new RFIDReader()) 
     { 
      scanner.StartStreaming(); 

      while (true) 
      { 
       foreach (string s in scanner.GetData(0)) 
       { 
        WriteLine($"antenna0: {s}"); 
       } 
       Thread.Sleep(1000); 
      } 
     } 
    }); 
    Task t = Task.Factory.StartNew(a); 

    t.Wait(); 
} 
+1

Рассмотрите возможность использования [Task.ConfigureAwait (false), чтобы избежать взаимоблокировок] (https://blog.ciber.no/2014/05/19/using-task-configureawaitfalse-to-prevent-deadlocks-in-async-code/) , – BoeseB

+0

Тогда вам нужен .NET 4.5, в производственном коде я бы сохранил SynchronizationContext и использовал его для обновления GUI ореха да в 4.5 просто позвоните ConfigureWait – Laurijssen

1

Если вы используете LibUsbDotNet Вы могли бы реагировать на DataReceivedEvent. Таким образом, вы избегаете блокировки при опросе новых данных. Если вы выбрали опрос aproach @ Servé, он уже показал вам, как отправить его в другую задачу, чтобы избежать блокировки основного потока.

Итак, это предлагаемое решение с DataReceivedEvent.

Инициализировать устройство USB:

IUsbDevice wholeUsbDevice = PhysicalLibUSBDevice as IUsbDevice; 
    if (!ReferenceEquals(wholeUsbDevice, null)) 
    { 
     // This is a "whole" USB device. Before it can be used, 
     // the desired configuration and interface must be selected. 

     // Select config #1 
     wholeUsbDevice.SetConfiguration(1); 

     // Claim interface #0. 
     wholeUsbDevice.ClaimInterface(0); 
    } 


    // Create the reader and writer streams 
    _libUsbReader = PhysicalLibUSBDevice.OpenEndpointReader(LibUsbDotNet.Main.ReadEndpointID.Ep01); 
    _libUsbWriter = PhysicalLibUSBDevice.OpenEndpointWriter(LibUsbDotNet.Main.WriteEndpointID.Ep02); 

    _libUsbReader.DataReceived += OnDataReceived; 
    _libUsbReader.DataReceivedEnabled = true; 
    _libUsbReader.ReadThreadPriority = System.Threading.ThreadPriority.Highest; 
    _libUsbReader.ReadBufferSize = 32; 

Определение EventHandler:

private void OnDataReceived(object sender, EndpointDataEventArgs e) 
{ 
    //Use the Buffer and Count Properties of the EventArgs to get the received data   
    Console.WriteLine("Data received"); 
} 

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

  • Нет связанных вопросов^_^