Я успешно отправил данные из UART, но мне не удалось
получать любые данные, даже если они были подтверждены полученным устройством
данные на провод.
Я не уверен, как вы «подтвердили, что устройство получило данные по проводам». Если вы установите InputStreamOptions.Partial
, так что даже если в проводе будет только один байт, эта строка await reader.LoadAsync( BufferSize_bytes ).AsTask();
вернет вас, вы получите этот один байт в буфере.
Также я понятия не имею, как вы обрабатываете полученные данные в PropogateReceivedData( ReadBuffer( buffer ) )
, здесь я использую следующие строки для преобразования данных в строку и отображения в пользовательском интерфейсе, к которому вы можете обратиться:
var dataReader = DataReader.FromBuffer(buffer);
rcvdText.Text = dataReader.ReadString(buffer.Length);
Я предлагаю вам использовать reader.ReadString(dataRead);
, если вы хотите получить строковые данные, и использовать reader.ReadBytes(readData);
, если вы хотите получить поток байтов. Более поддерживаемые API вы можете обратиться к DataReader .
Учитывая трудности, с которыми я столкнулся, пытаясь получить такой подход, я
мне интересно, должно ли это работать или нет, что мне нужно сделать, чтобы получить его
на работу.
Да, ваша логика должна работать, кроме меня, тайм-аут чтения никогда не происходит. Можете ли вы подтвердить, что тайм-аут чтения работает для вас, когда вы установили device.ReadTimeout = new TimeSpan( 0, 0, 0, 0, 200 );
? Есть ли информация о тайм-ауте?
Ниже приведены целые строки кода, которые я получаю из вашего вопроса для проверки, он работает для меня.
device.ReadTimeout = new TimeSpan(0, 0, 0, 0, 200);
var ReadDataCancellationTokenSource = new CancellationTokenSource();
const uint BufferSize_bytes = 50;
using (DataReader reader = new DataReader(device.InputStream))
{
reader.InputStreamOptions = InputStreamOptions.Partial;
while (!ReadDataCancellationTokenSource.IsCancellationRequested)
{
uint dataRead = await reader.LoadAsync(BufferSize_bytes).AsTask();
if (dataRead > 0)
{
IBuffer buffer = reader.ReadBuffer(dataRead);
if (buffer.Length > 0)
{
// rcvdText.Text = reader.ReadString(dataRead);
// var readData = new Byte[dataRead];
// reader.ReadBytes(readData);
var dataReader = DataReader.FromBuffer(buffer);
rcvdText.Text = dataReader.ReadString(buffer.Length);
status.Text = "bytes read successfully!";
}
}
}
}
Официальный серийный образец , на который вы можете сослаться.