Фиксация разрывов в переданных потоком данных USB

У нас есть аппаратная система с некоторым 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);
    }
6
задан Tim 27 July 2010 в 16:21
поделиться