purebasic.info

PureBasic forum
Текущее время: Пн ноя 19, 2018 12:55 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 49 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
СообщениеДобавлено: Сб окт 20, 2018 8:28 pm 
Не в сети
доцент

Зарегистрирован: Пн мар 30, 2015 5:48 pm
Сообщений: 51
Благодарил (а): 35 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Решил продолжить тему, хочется разобраться...)) Вот сеанс обмена данными с прибором (см. картинку). Отправляю запрос, делаю паузу проверяю входной буфер порта, читаю данные из порта в память. Здесь пауза после запроса составляет 5 мс.
Почему-то при проверке входного буфера ф-я AvailableSerialPortInput() возвращает 0, но в следующей строчке происходит успешное чтение данных из порта в память. В качестве примера вывел 3-й байт из пакета (86). Как так получается?
При установке паузы после запроса порядка 100 мс, AvailableSerialPortInput() возвращает правильное число поступивших байт, но иногда проскакивает ноль.

P.S.
Связь ПК с прибором организована через USB-COM преобразователь.


Вложения:
Безымянный.jpg [186.18 KiB]
Скачиваний: 0
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб окт 20, 2018 8:57 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
fil@tov писал(а):
Почему-то при проверке входного буфера ф-я AvailableSerialPortInput() возвращает 0, но в следующей строчке происходит успешное чтение данных из порта в память.
Когда функция AvailableSerialPortInput() была вызвана, данные еще не поступили. Функция ReadSerialPortData() ждет указанное число байт и как только были приняты, функция их вернет. На картинке не видно сколько пришло времени между вызовом AvailableSerialPortInput() и завершением выполнения ReadSerialPortData().

fil@tov писал(а):
Здесь пауза после запроса составляет 5 мс.
По картинке это не видно, но допустим. Какая скорость COM порта? Предположим 9600 бод. Передача одного байта занимает примерно 1 миллисекунду. Нужно отправить 1 байт в прибор и принять 19 байт, т. е. как минимум 20 миллисекунд на обмен. К этому нужно добавить что прибор может не сразу ответить, т. к. данные нужно подготовить. Плюс задержки связанные с USB.

Имена переменных и функции не очень удобочитаемые. Если так сделано чтобы случайно не совпали имена, лучше использовать модули. https://www.purebasic.com/documentation ... odule.html

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн окт 22, 2018 5:17 pm 
Не в сети
доцент

Зарегистрирован: Пн мар 30, 2015 5:48 pm
Сообщений: 51
Благодарил (а): 35 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Сделал еще пару сеансов обмена данными в режиме отладки. У меня 3 прибора, которые подключены параллельно к одному COM-порту. Прибору отправляешь 12-ти байтный пакет, в ответ прибор присылает 19-ти байтный пакет с данными. Прибор общается на скорости 19200 бод.
1. При паузе после запроса 1 мс интервал времени между ф-ми AvailableSerialPortInput() и ReadSerialPortData() составляет примерно 50 мс (см. рисунок «Пауза_1_мс»). В этом случае ф-я ReadSerialPortData() ожидает приход данных в порт. AvailableSerialPortInput() всегда возвращает ноль.
2. При паузе после запроса 50 мс интервал времени между ф-ми AvailableSerialPortInput() и ReadSerialPortData() составляет в среднем 0 мс (см. рисунок «Пауза_50_мс»). В этом случае достаточно часто проскакивают нули при вызове AvailableSerialPortInput().
3. При паузе после запроса 100 мс интервал времени между ф-ми AvailableSerialPortInput() и ReadSerialPortData() составляет 0 мс (см. рисунок «Пауза_100_мс»). В этом случае ф-я ReadSerialPortData() уже не ждет данных, а сразу читает их. Обмен данными протекает стабильно, но медленно. Т.к. приборов 3, то один и тот же прибор будет опрашиваться всерднем 3 раза в секунду. Хотелось бы раза в два побыстрее.
4. Еще протестировал приложение в версии PB 5.00 при отключенных приборах. Программа при отсутствии данных в порту не блокируется, а продолжает выполнять следующие инструкции (см. рисунок «Приборы отключены»). Странно, ведь в справке написано, что если входной буфер порта пуст, функция ReadSerialPortData() будет блокировать выполнение программы до тех пор, пока не считает данные (в более поздних версиях PB так и происходит).
Я хочу, чтобы опрос приборов проходил как можно быстрее и стабильнее. Пока что вижу 2 варианта:
1) Остаться на PB 5.00 и организовать опрос без использования проверки AvailableSerialPortInput(). При этом паузу после запроса можно поставить любую, обмен будет стабильным и быстрым (примерно 7 раз в секунду опрашивается один прибор).
2) Включить в код проверку входного буфера AvailableSerialPortInput() с паузой порядка 100 мс, но как-то при этом нужно ускорить процесс опроса приборов. Может на разные порты их зацепить или как-то программно можно решить задачу?
Может что-то посоветуете... Спасибо! :)


Вложения:
скрин.rar [472.36 KiB]
Скачиваний: 6
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн окт 22, 2018 5:28 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
Если есть логический анализатор, можно посмотреть сколько на самом деле времени проходит между запросом и ответом.
Если прибор отвечает с задержкой, то программно мало что можно сделать.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 49 ]  На страницу Пред.  1, 2, 3, 4

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB