У нас есть аппаратная система с некоторым FPGA и контроллер USB FTDI. Аппаратные потоковые данные по объему USB передают ПК приблизительно в 5MB/s, и для программного обеспечения определяют задачу с пребыванием в синхронизации, проверкой CRC и записью данных в файл.
Микросхема FTDI имеет 'занятый' контакт, который идет высоко в то время как его ожидание ПК для ведения его бизнеса. Существует ограниченный объем буферизации в FTDI и в другом месте на аппаратных средствах.
Занятая линия идет высоко для дольше, чем аппаратные средства могут буферизовать (50-100ms), таким образом, мы теряем данные. Для сохранения нас от необходимости перепроектировать аппаратные средства, меня попросили 'устранить' эту проблему!
Я думаю, что мой код достаточно быстр, поскольку у нас был он доходящий 15MB/s, так, чтобы листы узкое место IO где-нибудь. Мы просто ожидаем слишком много от ПК/ОС?
Вот моя точка ввода данных. Иногда мы получаем отброшенный бит или байт. Если контрольная сумма не вычисляет, я смещаюсь через, пока она не делает. байт [] данные почти всегда 4k.
void ftdi_OnData(byte[] data)
{
List<byte> buffer = new List<byte>(data.Length);
int index = 0;
while ((index + rawFile.Header.PacketLength + 1) < data.Length)
{
if (CheckSum.CRC16(data, index, rawFile.Header.PacketLength + 2)) // <- packet length + 2 for 16bit checksum
{
buffer.AddRange(data.SubArray<byte>(index, rawFile.Header.PacketLength));
index += rawFile.Header.PacketLength + 2; // <- skip the two checksums, we dont want to save them...
}
else
{
index++; // shift through
}
}
rawFile.AddData(buffer.ToArray(), 0, buffer.Count);
}