有人可以帮我如何读取序列号,连接到Raspbery Pi的两个rfid阅读器的时间戳.python,c# .Net中有一些解决方案,但在javascript中没有。
我正在尝试与 Node Js 进行交互,但没有找到任何有用的资源来从两个 rfid 阅读器读取数据。
提前非常感谢
要从多个RFID阅读器读取数据,您可以使用以下内容:
1. 对于从节点读取数据:
有一些项目涉及从节点读取RFID标签,例如这里和这里。
此外,还有一些 npm 包,例如 rfidreader。
甚至还有专门用于RC522的,例如rc522-c7z
2. 对于多个阅读器:
每个读卡器都应由唯一的串行端口提供。这需要从步骤 1 传递到代码。
这是 Raspbbery Pi 上的 Windows 10 UWP 应用程序的示例。 您必须小心在 UWP ConSept 上使用异步编程。
using System;
using System.Collections.ObjectModel;
using System.Threading;
using System.Threading.Tasks;
using Windows.Devices.Enumeration;
using Windows.Devices.SerialCommunication;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace Prova_comunicazione_seriale
{
public sealed partial class MainPage : Page
{
private SerialDevice serialPort = null;
DataWriter dataWriteObject = null;
DataReader dataReaderObject = null;
private ObservableCollection<DeviceInformation> listOfDevices;
private CancellationTokenSource ReadCancellationTokenSource;
public MainPage()
{
InitializeComponent();
btnAccendiled.IsEnabled = false;
btnSpegniled.IsEnabled = false;
listOfDevices = new ObservableCollection<DeviceInformation>();
ListAvailablePorts();
}
private async void ListAvailablePorts()
{
try
{
string aqs = SerialDevice.GetDeviceSelector();
var dis = await DeviceInformation.FindAllAsync(aqs);
for (int i = 0; i < dis.Count; i++)
{
listOfDevices.Add(dis[i]);
}
lstSerialDevices.ItemsSource = listOfDevices;
btnAccendiled.IsEnabled = true;
btnSpegniled.IsEnabled = true;
lstSerialDevices.SelectedIndex = -1;
}
catch (Exception ex)
{
tbkAllarmi.Text = ex.Message;
}
}
private async void ButtonClick(object sender, RoutedEventArgs e)
{
var buttonClicked = sender as Button;
switch(buttonClicked.Name)
{
case "btnSerialConnect":
SerialPortConfiguration();
break;
case "btnSerialDisconnect":
SerialPortDisconnect();
break;
case "btnAccendiled":
if (serialPort != null)
{
dataWriteObject = new DataWriter(serialPort.OutputStream);
await ManageLed("2");
}
if (dataWriteObject != null)
{
dataWriteObject.DetachStream();
dataWriteObject = null;
}
break;
case "btnSpegniled":
if (serialPort != null)
{
dataWriteObject = new DataWriter(serialPort.OutputStream);
await ManageLed("1");
}
if (dataWriteObject != null)
{
dataWriteObject.DetachStream();
dataWriteObject = null;
}
break;
case "btnPulse1000ms":
if (serialPort != null)
{
dataWriteObject = new DataWriter(serialPort.OutputStream);
await ManageLed("3");
}
if (dataWriteObject != null)
{
dataWriteObject.DetachStream();
dataWriteObject = null;
}
break;
case "btnPulse2000ms":
if (serialPort != null)
{
dataWriteObject = new DataWriter(serialPort.OutputStream);
await ManageLed("4");
}
if (dataWriteObject != null)
{
dataWriteObject.DetachStream();
dataWriteObject = null;
}
break;
}
}
private async void SerialPortConfiguration()
{
var selection = lstSerialDevices.SelectedItems;
if (selection.Count <= 0)
{
tbkAllarmi.Text = "Seleziona un oggetto per la connessione seriale!";
return;
}
DeviceInformation entry = (DeviceInformation)selection[0];
try
{
serialPort = await SerialDevice.FromIdAsync(entry.Id);
serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
serialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
serialPort.BaudRate = 9600;
serialPort.Parity = SerialParity.None;
serialPort.StopBits = SerialStopBitCount.One;
serialPort.DataBits = 8;
serialPort.Handshake = SerialHandshake.None;
tbkAllarmi.Text = "Porta seriale correttamente configurata!";
ReadCancellationTokenSource = new CancellationTokenSource();
Listen();
}
catch (Exception ex)
{
tbkAllarmi.Text = ex.Message;
btnAccendiled.IsEnabled = false;
btnSpegniled.IsEnabled = false;
}
}
private void SerialPortDisconnect()
{
try
{
CancelReadTask();
CloseDevice();
ListAvailablePorts();
}
catch (Exception ex)
{
tbkAllarmi.Text = ex.Message;
}
}
private async Task ManageLed(string value)
{
var accendiLed = value;
Task<UInt32> storeAsyncTask;
if (accendiLed.Length != 0)
{
dataWriteObject.WriteString(accendiLed);
storeAsyncTask = dataWriteObject.StoreAsync().AsTask();
UInt32 bytesWritten = await storeAsyncTask;
if (bytesWritten > 0)
{
tbkAllarmi.Text = "Valore inviato correttamente";
}
}
else
{
tbkAllarmi.Text = "Nessun valore inviato";
}
}
private async void Listen()
{
try
{
if (serialPort != null)
{
dataReaderObject = new DataReader(serialPort.InputStream);
while (true)
{
await ReadData(ReadCancellationTokenSource.Token);
}
}
}
catch (Exception ex)
{
tbkAllarmi.Text = ex.Message;
if (ex.GetType().Name == "TaskCanceledException")
{
CloseDevice();
}
else
{
tbkAllarmi.Text = "Task annullato";
}
}
finally
{
if (dataReaderObject != null)
{
dataReaderObject.DetachStream();
dataReaderObject = null;
}
}
}
private async Task ReadData(CancellationToken cancellationToken)
{
Task<UInt32> loadAsyncTask;
uint ReadBufferLength = 1024;
cancellationToken.ThrowIfCancellationRequested();
dataReaderObject.InputStreamOptions = InputStreamOptions.Partial;
loadAsyncTask = dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken);
UInt32 bytesRead = await loadAsyncTask;
if (bytesRead > 0)
{
tbkStatusLed.Text = dataReaderObject.ReadString(bytesRead);
}
}
private void CancelReadTask()
{
if (ReadCancellationTokenSource != null)
{
if (!ReadCancellationTokenSource.IsCancellationRequested)
{
ReadCancellationTokenSource.Cancel();
}
}
}
private void CloseDevice()
{
if (serialPort != null)
{
serialPort.Dispose();
}
serialPort = null;
btnAccendiled.IsEnabled = false;
btnSpegniled.IsEnabled = false;
listOfDevices.Clear();
}
}
}
}