Всем привет
Имеется прибор на процессоре imx6UL Под него сборка дебиан от производителя.
В общем надо с этого прибора опрашивать другие по rs-485 на скорости 9600.
Порт открывается настраивается в неблокирующем режиме и т.д. и т.п. Чтение / запись работают через select с заданным таймаутом.
В итоге получается как-то так, что реальная скорость отправки данных существенно ниже установленной 9600.
Команда int bytes_write = write(fd, frame_write, frame_write_size) выполняется моментально. Но дальше получаем жуткий таймаут на получение данных. Проверили осциллографом, что данные на опрашиваемый прибор приходят и он отвечает сразу же без задержек.
Стал разбираться. Вставил после write команду tcdrain( fd ) И вот уже на ее выполнение (ожидание пока данные уйдут) отжирается в среднем 30 миллисекунд. В посылке 7 байт.
Ясно, что функцией write сначала скидывается в буфер, а потом запихивается в физическое устройство.
Но не 30 же миллисекунд на отсылку 56 бит?? По заявленной скорости на это должно уходить 5мс в идеале ).
Вопрос: можно ли как-то оптимизировать в линуксе всё это дело.
Под виндами написал такой же код, там всё просто летает. Отправка данных на 9600 на той же линии занимает в пределах 5-7 миллисекуд и примерно через столько же приходит ответ.
Что в линуксе не так?