У меня есть проект, который выдает 32768 значений int16_t каждые 1,125 секунды. Какой самый эффективный способ «упаковать» их для передачи через USB? В настоящее время я выкачиваю их с запятыми между каждым значением (и точкой с запятой через каждые 4096 значений, с последним символом «X»). Мне приходит в голову, что хост не будет знать, что данное значение составляет один или два байта, поэтому предварительное выделение буфера и ожидание его заполнения не сработает.
Устройство USB запрограммировано на C ++, а хост запрограммирован на C #, если это помогает. На стороне хоста я получил эту функцию из образца UWP:
private async Task ReadAsync(CancellationToken cancellationToken)
{
Task<UInt32> loadAsyncTask;
uint ReadBufferLength = 98305;
// Don't start any IO if we canceled the task
lock (ReadCancelLock)
{
cancellationToken.ThrowIfCancellationRequested();
// Cancellation Token will be used so we can stop the task operation explicitly
// The completion function should still be called so that we can properly handle a canceled task
DataReaderObject.InputStreamOptions = InputStreamOptions.Partial;
loadAsyncTask = DataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken);
}
UInt32 bytesRead = await loadAsyncTask;
if (bytesRead > 0)
{
ReadBytesTextBlock.Text += DataReaderObject.ReadString(bytesRead);
ReadBytesCounter += bytesRead;
UpdateReadBytesCounterView();
}
rootPage.NotifyUser("Read completed - " + bytesRead.ToString() + " bytes were read", NotifyType.StatusMessage);
}
Есть ли способ, позволяющий мне читать, пока не будет обнаружен определенный символ, такой как "X"? В конечном итоге эти значения необходимо проанализировать в массивах int16_t, чтобы я мог выполнить некоторые БПФ.
Я признаю, что прямо сейчас я действительно взломал это вместе и надеюсь, что это сработает, но я бы хотел надежный и надежный способ сделать это правильно.