СОМ-порт и Windows, как повысить реакцию на прием байт?

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

СОМ-порт и Windows, как повысить реакцию на прием байт?

Сообщение DropSoft » 25.05.2021 18:42:11

Работаю с СОМ-портом из Windows, использую модуль Synaser из библиотеки Synapase.
При чтении порта данные приходят частями с интервалом 15-17 мс. Вот пример лога чтения ответа на очередной запрос:
Код: Выделить всё
16:54:23.621 _Send> 03 41 00 06 C8 38 8A 34
16:54:23.621 _isRC>
16:54:23.623 _isRC>
16:54:23.625 _isRC> 03 41 00 06 C8 38 FF FF FF FF FF
16:54:23.627 _isRC>
16:54:23.629 _isRC>
16:54:23.631 _isRC>
16:54:23.633 _isRC>
16:54:23.635 _isRC>
16:54:23.637 _isRC>
16:54:23.639 _isRC>
16:54:23.642 _isRC> FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F6 69

Получается, в 621 мс послан запрос, в 625 мс получена первая часть данных, затем около 17 мс ничего нет, а потом в 642мс приходит оставшаяся часть посылки.
Хотя физически ответная посылка передается цельным куском. Я понимаю, что это особенности работы Windows, прием производится через
Код: Выделить всё
ReadFile(FHandle, Buffer^, length, Dword(Result), @Overlapped)

Но можно ли как-нибудь этого избежать, чтобы получать байты из порта не позднее хотя бы одной миллисекунды после их физического прихода в UART?
DropSoft
новенький
 
Сообщения: 31
Зарегистрирован: 31.03.2013 13:47:40

Re: СОМ-порт и Windows, как повысить реакцию на прием байт?

Сообщение olegy123 » 29.05.2021 06:04:35

Откуда получаете данные, как читаете, могут ли быть там задержки. Есть ли возможность работать на больших скоростях. Нужны больше информации.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: СОМ-порт и Windows, как повысить реакцию на прием байт?

Сообщение DropSoft » 01.06.2021 10:42:48

Посылается запрос на скорости вплоть до 3 МБод (переходник с USB на FT232R поддерживает).
На посылку приходит ответ от прибора, практически сразу (задержка - менее пары сотен микросекунд), длина посылок ограничена 256 байт (ограничение прибора), если компьютер не получил ответ на посылку в течении таймаута (обычно 50-100 мс), запрос повторяется несколько раз. Если физическая среда RS-485 - полудуплекс, то _одновременно_ посылать и принимать нельзя. При этом цикл обмена составляет (по осциллографу) в районе 1000...1100 мкс. А фактически из-за Windows цикл занимает 16...20 мс. При передаче больших массивов информации (или опросе большой сети приборов) время увеличивается фактически в 15 и более раз.
Длина ответной посылки указывается в заголовке ответной посылки, что требует побайтного анализа приходящих данных, чтобы выделить заголовок и затем принять указанное число байтов и проверить контрольную сумму. Циклы передачи - приема ведутся в отдельном потоке.
Пробовал играть значениями структуры COMMTIMEOUTS, не помогает.
DropSoft
новенький
 
Сообщения: 31
Зарегистрирован: 31.03.2013 13:47:40

Re: СОМ-порт и Windows, как повысить реакцию на прием байт?

Сообщение Seenkao » 01.06.2021 13:17:28

Сделай задержку на отсылку данных.

Насколько я читал, там слишком большая частота отправки данных, из-за этого происходят сбои.
Seenkao
энтузиаст
 
Сообщения: 526
Зарегистрирован: 01.04.2020 03:37:12

Re: СОМ-порт и Windows, как повысить реакцию на прием байт?

Сообщение olegy123 » 01.06.2021 18:25:29

DropSoft писал(а):Получается, в 621 мс послан запрос, в 625 мс получена первая часть данных, затем около 17 мс ничего нет, а потом в 642мс приходит оставшаяся часть посылки.
на сколько помню, можно работать в неблокирующим режиме. Читать обязательно весь буфер а не посимвольно.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: СОМ-порт и Windows, как повысить реакцию на прием байт?

Сообщение Pavia » 03.06.2021 08:08:23

Overlapped тормозит. Пиши без него.

Добавлено спустя 2 минуты 36 секунд:
DropSoft писал(а):При чтении порта данные приходят частями с интервалом 15-17 мс. Вот пример лога чтения ответа на очередной запрос:

А таймер для лога у вас какой если gettickcount то у него дискретность 15-17 мс.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Re: СОМ-порт и Windows, как повысить реакцию на прием байт?

Сообщение DropSoft » 04.06.2021 10:19:43

Pavia Таймер миллисекунды правильно выдает, без пропусков.
Код: Выделить всё
MemoLog.Add(FormatDateTime('HH:NN:SS.ZZZ  ',Now) + s);

Без overlapped попробую, это надо будет в исходниках модуля Synaser из библиотеки Synapase ковыряться.
DropSoft
новенький
 
Сообщения: 31
Зарегистрирован: 31.03.2013 13:47:40

Re: СОМ-порт и Windows, как повысить реакцию на прием байт?

Сообщение info53 » 08.06.2021 11:28:55

Попробуйте уменьшить таймаут в настройках драйвера FT232, как указано на картинке ниже
Вложения
FT232_Timeout.png
Таймаут
info53
незнакомец
 
Сообщения: 1
Зарегистрирован: 07.06.2021 11:50:43

Re: СОМ-порт и Windows, как повысить реакцию на прием байт?

Сообщение АндрейБ » 11.06.2021 09:11:39

Если вы используете микросхему FTDI для организации виртуального СОМ-порта,
то решение, на мой взгляд, есть. В диспетчере устройств в настройках виртуального
СОМ-порта в дополнительных настройках есть параметр "Время ожидания (мсек)".
По умолчанию там стоит 16мс, но можно поставить 1мс.
И сразу становится всё намного быстрее.
АндрейБ
незнакомец
 
Сообщения: 1
Зарегистрирован: 09.06.2021 08:29:34


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru