Тормоза при обмене по RS-485, задержка при отправке данных в порт |
Здравствуйте, гость ( Вход | Регистрация )
Тормоза при обмене по RS-485, задержка при отправке данных в порт |
demon051 |
10.11.2020, 15:30
Сообщение
#1
|
Студент Группа: Участник Сообщений: 27 Регистрация: 12.8.2014 Пользователь №: 4209 Спасибо сказали: 4 раз(а) Репутация: 0 |
Всем привет
Имеется прибор на процессоре imx6UL Под него сборка дебиан от производителя. В общем надо с этого прибора опрашивать другие по rs-485 на скорости 9600. Порт открывается настраивается в неблокирующем режиме и т.д. и т.п. Чтение / запись работают через select с заданным таймаутом. В итоге получается как-то так, что реальная скорость отправки данных существенно ниже установленной 9600. Команда int bytes_write = write(fd, frame_write, frame_write_size) выполняется моментально. Но дальше получаем жуткий таймаут на получение данных. Проверили осциллографом, что данные на опрашиваемый прибор приходят и он отвечает сразу же без задержек. Стал разбираться. Вставил после write команду tcdrain( fd ) И вот уже на ее выполнение (ожидание пока данные уйдут) отжирается в среднем 30 миллисекунд. В посылке 7 байт. Ясно, что функцией write сначала скидывается в буфер, а потом запихивается в физическое устройство. Но не 30 же миллисекунд на отсылку 56 бит?? Вопрос: можно ли как-то оптимизировать в линуксе всё это дело. Под виндами написал такой же код, там всё просто летает. Отправка данных на 9600 на той же линии занимает в пределах 5-7 миллисекуд и примерно через столько же приходит ответ. Что в линуксе не так? |
|
|
Iron Bug |
17.11.2020, 21:36
Сообщение
#2
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
попробуй добавить флаг ASYNC_LOW_LATENCY для твоего девайса.
а вообще, если хочешь, чтобы тебе дали совет - пости код, который у тебя не работает. а то гадать на кофейной гуще сложно. |
|
|
Текстовая версия | Сейчас: 24.11.2024, 6:52 |