У меня есть компьютер, который подключается к внешним устройствам посредством последовательной связи (то есть RS-232/RS-422 физических или эмулируемых последовательных портов). Они взаимодействуют друг с другом посредством частого обмена данными (30 Гц), но с небольшим пакетом данных (менее 16 байт для каждого пакета).Последовательная связь с минимальной задержкой
Наиболее важным требованием связи является низкая латентность или задержка между передачей и приемом.
Модель обмена данными - рукопожатие. Одно хост-устройство инициирует связь и продолжает отправлять уведомления на клиентском устройстве. Клиентскому устройству необходимо как можно быстрее ответить на каждое извещение с хост-устройства (это именно то, где нужно достичь низкой задержки). Пакеты данных уведомлений и ответов четко определены; а именно длина данных известна. И в основном потеря данных не допускается.
Я использовал следующие общие функции API Win, чтобы сделать ввода/вывода для чтения/записи в синхронном режиме: CreateFile, ReadFile, WriteFile
Клиентское устройство использует ReadFile для чтения данных из хост-устройства. Как только клиент прочитает полный пакет данных, длина которого известна, он использует WriteFile для ответа на хост-устройство с соответствующим пакетом данных. Чтения и записи всегда последовательны без параллелизма.
Как-то сообщение не достаточно быстро. А именно, продолжительность времени между отправкой и получением данных занимает слишком много времени. Я предполагаю, что это может быть проблемой при буферизации или прерываниях последовательного порта.
Здесь я подытоживаю некоторые возможные действия для улучшения задержки. Пожалуйста, дайте мне несколько предложений и поправок :)
- вызова CreateFile с флагом FILE_FLAG_NO_BUFFERING? Я не уверен, является ли этот флаг актуальным в этом контексте.
- вызов FlushFileBuffers после каждого WriteFile? или любое действие, которое может уведомлять/прерывать последовательный порт для немедленной передачи данных?
- установить более высокий приоритет для потока и процесса, который обрабатывает последовательную связь
- установить таймер задержки или размер передачи для эмулируемых устройств (с их драйвером). Но как насчет физического последовательного порта?
- любые эквивалентные материалы в Windows, такие как setserial/low_latency под Linux?
- отключить FIFO?
благодарим заранее!
Вы пытались настроить [тайм-ауты] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363437%28v=vs.85%29.aspx)? Что именно «недостаточно быстро»? Overlapped IO, управляемый событиями ...? – dyp
Это будет зависеть от аппаратного обеспечения. Вы используете последовательный порт USB, карту последовательного порта или одну, расположенную на материнской плате? –
Установка тайм-аута может не помочь в моем случае.Моим устройствам необходимо выполнить некоторый обмен данными, подобный рукопожатию, с очень низкой задержкой и не допускать потери данных. «Не достаточно быстро» означает, что длительность времени между отправкой данных с одного устройства и получением другим происходит слишком долго. – elgcom