2013-04-01 3 views
2

У меня есть компьютер, который подключается к внешним устройствам посредством последовательной связи (то есть RS-232/RS-422 физических или эмулируемых последовательных портов). Они взаимодействуют друг с другом посредством частого обмена данными (30 Гц), но с небольшим пакетом данных (менее 16 байт для каждого пакета).Последовательная связь с минимальной задержкой

Наиболее важным требованием связи является низкая латентность или задержка между передачей и приемом.

Модель обмена данными - рукопожатие. Одно хост-устройство инициирует связь и продолжает отправлять уведомления на клиентском устройстве. Клиентскому устройству необходимо как можно быстрее ответить на каждое извещение с хост-устройства (это именно то, где нужно достичь низкой задержки). Пакеты данных уведомлений и ответов четко определены; а именно длина данных известна. И в основном потеря данных не допускается.

Я использовал следующие общие функции API Win, чтобы сделать ввода/вывода для чтения/записи в синхронном режиме: CreateFile, ReadFile, WriteFile

Клиентское устройство использует ReadFile для чтения данных из хост-устройства. Как только клиент прочитает полный пакет данных, длина которого известна, он использует WriteFile для ответа на хост-устройство с соответствующим пакетом данных. Чтения и записи всегда последовательны без параллелизма.

Как-то сообщение не достаточно быстро. А именно, продолжительность времени между отправкой и получением данных занимает слишком много времени. Я предполагаю, что это может быть проблемой при буферизации или прерываниях последовательного порта.

Здесь я подытоживаю некоторые возможные действия для улучшения задержки. Пожалуйста, дайте мне несколько предложений и поправок :)

  1. вызова CreateFile с флагом FILE_FLAG_NO_BUFFERING? Я не уверен, является ли этот флаг актуальным в этом контексте.
  2. вызов FlushFileBuffers после каждого WriteFile? или любое действие, которое может уведомлять/прерывать последовательный порт для немедленной передачи данных?
  3. установить более высокий приоритет для потока и процесса, который обрабатывает последовательную связь
  4. установить таймер задержки или размер передачи для эмулируемых устройств (с их драйвером). Но как насчет физического последовательного порта?
  5. любые эквивалентные материалы в Windows, такие как setserial/low_latency под Linux?
  6. отключить FIFO?

благодарим заранее!

+0

Вы пытались настроить [тайм-ауты] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363437%28v=vs.85%29.aspx)? Что именно «недостаточно быстро»? Overlapped IO, управляемый событиями ...? – dyp

+0

Это будет зависеть от аппаратного обеспечения. Вы используете последовательный порт USB, карту последовательного порта или одну, расположенную на материнской плате? –

+0

Установка тайм-аута может не помочь в моем случае.Моим устройствам необходимо выполнить некоторый обмен данными, подобный рукопожатию, с очень низкой задержкой и не допускать потери данных. «Не достаточно быстро» означает, что длительность времени между отправкой данных с одного устройства и получением другим происходит слишком долго. – elgcom

ответ

1

У меня возникла аналогичная проблема с последовательным портом. В моем случае я решил проблему, уменьшающую латентность последовательного порта. Вы можете изменить латентность каждого порта (который по умолчанию установлен на 16 мс) с помощью панели управления. Вы можете найти способ здесь: http://www.chipkin.com/reducing-latency-on-com-ports/

Удачи !!!

Смежные вопросы