Я успешно подключил свой RFID-ридер и открыл порт, и он работает, я также записал в него байты с помощью класса DataWriter.Но теперь при попытке чтения байтов из RFID-ридера это не работает.PS: я пытаюсь добиться этого в приложении UWP, используя MVVM Pattern.и он работал в классическом приложении, поэтому все конфигурации правильные.
И это мой VMClass
DataWriter dataWriter;
//readobjects
private CancellationTokenSource ReadCancellationTokenSource;
private Object ReadCancelLock = new Object();
//writeObjects
private CancellationTokenSource WriteCancellationTokenSource;
private Object WriteCancelLock = new Object();
DataReader DataReaderObject;
int id1;
public viewModel()
{
// listOfDevices = new ObservableCollection<DeviceListEntry>();
findAndOpenAsync();
}
public async Task findAndOpenAsync()
{
string selector = SerialDevice.GetDeviceSelector("COM5");
DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selector);
if (devices.Count > 0)
{
DeviceInformation deviceInfo = devices[0];
serialDevice = await SerialDevice.FromIdAsync(deviceInfo.Id);
serialDevice.BaudRate = 9600;
serialDevice.DataBits = 8;
serialDevice.StopBits = SerialStopBitCount.One;
serialDevice.Parity = SerialParity.None;
WriteCancellationTokenSource = new CancellationTokenSource();
ReadCancellationTokenSource = new CancellationTokenSource();
serialDevice.WriteTimeout = new TimeSpan(0, 0, 10);
await Write(WriteCancellationTokenSource.Token);
int id2 = id1;
}
else
{
MessageDialog popup = new MessageDialog("Sorry, no device found.");
await popup.ShowAsync();
}
}
public async Task Write(CancellationToken cancellationToken)
{
try
{
while (!Recived)
{
Task<UInt32> storeAsyncTask;
dataWriter = new DataWriter(serialDevice.OutputStream);
byte[] buffer = new byte[9];
buffer[0] = 0x7e; //head fixed 7eh
buffer[1] = 0x04; //length 4
buffer[2] = 0x01; //destination
buffer[3] = 0x13; //function code
buffer[4] = 0xed; // destination xor function
buffer[5] = 0x01; // sum (destination+function+xor)modulo256
dataWriter.WriteBytes(buffer);
// uint a= await dataWriter.StoreAsync();
lock (WriteCancelLock)
{
cancellationToken.ThrowIfCancellationRequested();
storeAsyncTask = dataWriter.StoreAsync().AsTask(cancellationToken);
}
UInt32 bytesWritten = await storeAsyncTask;
dataWriter.DetachStream();
dataWriter.Dispose();
if (bytesWritten > 0)
{
DataReaderObject = new DataReader(serialDevice.InputStream);
await Read(ReadCancellationTokenSource.Token);
}
}
}
catch (Exception ex) {
}
}
private async Task Read(CancellationToken cancellationToken)
{
byte[] bufferRead = new byte[12];
Task<UInt32> loadAsyncTask;
uint ReadBufferLength = 1024;
// Don't start any IO if we canceled the task
lock (ReadCancelLock)
{
cancellationToken.ThrowIfCancellationRequested();
DataReaderObject.InputStreamOptions = InputStreamOptions.Partial;
loadAsyncTask = DataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken);
}
UInt32 bytesRead = await loadAsyncTask;
if (bytesRead > 0)
{
try
{
DataReaderObject.ReadBytes(bufferRead);
byte[] idBytes = new byte[4];
idBytes[0] = bufferRead[8];
idBytes[1] = bufferRead[7];
idBytes[2] = bufferRead[6];
idBytes[3] = bufferRead[5];
id1 = BitConverter.ToUInt16(idBytes, 0);
Recived = true;
}
catch (Exception ec)
{
}
finally
{
DataReaderObject.DetachStream();
DataReaderObject.DetachBuffer();
DataReaderObject.Dispose();
}
}
}
}