Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задержка при работе с RS232
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Muscat
Добрый день.
Попробую еще раз задать вопрос на форуме, хотя уже и без особой надежды на ответ.

Есть задача - научиться подавать в ПЛИС длинные последовательности бит (от 10^6 байт по 6 бит).
Имеется отладочная плата Actel, на которой установлена микросхема USB->RS232, а на PC установлен виртуальным COM-порт. Таким образом физически RS232 нигде не существует, однако для всех приложений существует COM-порт, в который я могу писать данные, а для ПЛИС существует 2 контакта RX и ТХ для передачи данных.

Теперь собственно к проблеме.
Поскольку физические ограничения на скорость существует только по USB, я пишу данные со скорость 1.5МБит секунду.

В среде Матлаб это выглядит так
Код
s = serial('COM2');
s.BaudRate=1.5*10^6;
fopen(s);
fwrite(s,'!&!');
fclose(s);

Данные пишутся как надо, на осциллографе я вижу требуемые сигналы, длительной одного байта - 4.8 мкс.
Пакеты данных так же передаются как надо, без трудностей,байт за байтом
Код
fwrite(s,'ABCDEFGHIJKLM');


Далее, задача состоит в том, чтобы организовать обмен данными между ПЛИС и PC
Прием->Передача->Прием->Передача
Для чистоты опыта задача прием пока выключен, то есть я пробую выполнить 2 команды передачи последовательно
Код
fwrite(s,'A');
fwrite(s,'B');
И вот тут случается странное. Длительность байт не меняется, однако между самими байтами возникает интервал в 80мс. То есть 4мкс порт занят передачей, потом 80мс ждет, потом передает следующий байт.


Откуда возникает эта задержка и как с ней бороться? Одно из временных решений - увеличить размер входного буфера до 1024 бит, и тогда передача будет идти не 4 мкс, а 4 мс, пауза сохранится прежней 80мс. Но КПД по прежнему просто несерьезный.

Где узкое место и чего дожидается система?

Чиповод
то есть задержка 80-100мс между fwrite(s,'A'); и fwrite(s,'B'); ?? Ну это все же не ассемблерные команды процессора под чистым ДОСом, странно что только 80мс, я думал Матлаб тормознее выводит.

А что мешает использовать fwrite(s,'AB')??
remote_job
Никакого риал тайма с Windows+USB<->UART + МАТЛАБ вы не добьетесь. Вы не сможете запретить ОС как минимум переключить задачи между вашими двумя посылками. Снизить вероятность задержки может и можно буферами всякими, но никаких гарантий. А рекомендация правильная, вы как минимум в рамках одной операции fwrite уж постарайтесь данные отправлять, и то повторюсь формальной гарантии не будет.
Чиповод
Оценил, насколько, у меня система реального времени. Компьютер - десктоп Core2Duo E8400 3.0ГГц, Com-port аппаратный, WinXP. Написал матлаб-код и загнал команды fwrite в цикл то есть
Код
while(1)
   fwrite(s,'A');
   fwrite(s,'A');
end;

Смотрел осциллографом на то, что ко мне приходит. Означенные выше байты доставлены были доставлены ровными импульсами, уровнями от -12 до +12В. Расстояние между двумя байтами составило 300-400 мкс и колебалось по неведомому закону. Нагрузил процессор до зела, поставив Quartus раскладывать тяжелый проект. И только, когда загрузка обеих ядер ПК стала 99% (Fitter Quarus'a так может), второй импульс стал улетать с экрана осциллографа, подрегулировав развертку я определил, что задержка увеличилась до 700-800мкс.

Но 300-800мкс, это все же не 80-100мс, как в Вашем случае, так, что в узком горлышке можно заподозрить переходник USB->RS232 и всю его инфраструктуру с драйверами, пакетами и т.д.

P.S. кстати команда
fwrite(s,'AB');
выдает байты на осциллограф без задержек, совсем без задержек.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.