Форум программистов, компьютерный форум CyberForum.ru

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
 
MrTimmy
0 / 0 / 0
Регистрация: 05.11.2016
Сообщений: 8
#1

Скорость COM порта - Delphi WinAPI

05.11.2016, 18:05. Просмотров 1056. Ответов 21
Метки нет (Все метки)

Здравствуйте.

Ситуация такая. Налаживаю общение по UART между ПК и МК. Все делал на одном компьютере и вроде все шло хорошо пока не перешел на другой. Тут начались проблемы:

При чтении порта скорость в 2КК как бы задается если судить по соответствующему параметру, но на деле все печальнее. Замерял время посылки большого пакета и выходит примерно скорость не превышает 250К (т.е. при 2КК время примерно 15 секунд на пакет и при 250К то же значение).

На другом компьютере такого не замечено (Первый ПК на Win10 второй на Win7 если это критично).

В чем может быть беда (пишу на Delphi XE8)?

З.Ы. Я новичок не грузите терминами плиз =)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2016, 18:05     Скорость COM порта
Посмотрите здесь:

Программная перезагрузка COM порта - Delphi WinAPI
Есть кассовый аппарат, подключаемый к ПК посредством порта. Кассиры как-то умудряются загнать аппарат(или порт) до такой степени, что...

Запись данных с COM порта в текстовый документ - Delphi WinAPI
Добрый день, Уважаемые Форумчане! Задача следующая: Необходимо подключиться к прибору по COM порту, считать с него данные и записать...

Откуда при чтении из COM-порта берутся 99 байт? - Delphi WinAPI
Здравствуйте! Этот отрывок кода взят из рабоче программы, которая работает около 2-х лет и судя по отзывам - успешно. Она написана на...

Как бы вы сделали обмен между потоками для СОМ порта - Delphi WinAPI
Добрый день Всем. Собственно сам вопрос как лучше сделать синхронизацию/обмен между потоками одного приложения. Знаю что можно через...

Скорость записи дисков - Delphi WinAPI
Вообщем пытаюсь сделать программу для записи дисков, делаю саму прогу по примерам в интернете, но не могу найти примера как сделать выбор...

Изменить скорость курсора сразу - Delphi WinAPI
Доброго времени суток. Делаю замену стандартной настройки мыши в Windows. Как сделать так, чтоб при изменении позиции в...

Не могу изменить скорость порта - Arduino
У меня Нано v3.0 с СР340. При обмене по COM порту на скорости 9600 - всё идеально. Меняю в скетче скорость (пробовал 19200, 57600, 115200),...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
northener
3064 / 2121 / 438
Регистрация: 15.07.2013
Сообщений: 12,314
08.11.2016, 02:20     Скорость COM порта #2
Цитата Сообщение от MrTimmy Посмотреть сообщение
При чтении порта скорость в 2КК
Это в каких единицах? В килограммах калош?
Скорость последовательного порта нельзя задать произвольно. Есть только дискретный набор точно заданных скоростей.
MrTimmy
0 / 0 / 0
Регистрация: 05.11.2016
Сообщений: 8
08.11.2016, 18:59  [ТС]     Скорость COM порта #3
В метрах по запястью. Я конечно не силен во всем этом, но вроде как скорость UART измеряется в Бодах.

Еще скорее всего я обманул всех, что на другом компьютере было все хорошо =]. Был конец рабочего дня и в глазах нули уже двоились.

Ну и насколько я понял проблема в прошивке. Так как контроллер отковырял от Ардуинки ( ATMEGA328p ), там же нашел информацию о стандартной прошивке в которой, вроде, задается скорость в 115200 (максимальная?).

И как же быть с набором точных дискрет если в даташите контроллера есть таблица в которой значение достигает 2,5Mbps ( ну и собственно при тактовой 16Mhz максимальная скорость 2Mbps ). Так же при инициализации COM порта можно параметр достать ( dwSettableBaud ) в котором говорится о том что я могу на свое усмотрение поставить скорость. FT232 вроде не сопротивляется таким скоростям.

Достану программатор буду экспериментировать.

Помогите пожалуйста товарищи. Для меня это такой дремучий лес...

З.Ы. Верна ли моя догадка про прошивку?
northener
3064 / 2121 / 438
Регистрация: 15.07.2013
Сообщений: 12,314
09.11.2016, 02:20     Скорость COM порта #4
На контроллере подобного типа ты в большинстве случаев действительно можешь поставить почти любую скорость последовательного порта. Вот только в ОС Windows мелкомягкие не предусмотрели выбор произвольного значения скорости. Или не смогли/не захотели договорится с производителями чипсетов для матплат добиться такой же вольности.
А 115200 тебе действительно мало?
MrTimmy
0 / 0 / 0
Регистрация: 05.11.2016
Сообщений: 8
09.11.2016, 17:50  [ТС]     Скорость COM порта #5
Цитата Сообщение от northener Посмотреть сообщение
А 115200 тебе действительно мало?
Нужен сбор значений с 12 битного АЦП с частотой оцифровки 100 Ksps ( в перспективе повысить разрядность АЦПушки до 24 и научится разгонять шайтан порт до предельных значений, насколько это разумно мне пока не ведомо xD ).

Находил статейку с решением вопроса такого АЦП через USB, тупо копировать мне не хочется. Хотелось бы разобраться и сделать все самому. Так или иначе пригодится потом.
А так как приходится нырять во все это с нуля, движение происходит по принципу "шаг вперед и два назад".
quwy
Native x86
3132 / 1980 / 527
Регистрация: 13.02.2013
Сообщений: 6,628
09.11.2016, 19:06     Скорость COM порта #6
Цитата Сообщение от northener Посмотреть сообщение
Вот только в ОС Windows мелкомягкие не предусмотрели выбор произвольного значения скорости
При чем тут мелкомягкие? Программный интерфейс UART в персональных компьютерах изначально работал с дискретным набором скоростей еще со времен XT и 8250.

MrTimmy, большинство COM-портов на современной базе поддерживают скорости до 921600 bps. Даже если стандартные не поддерживают, всегда можно взять отдельный контроллер.
MrTimmy
0 / 0 / 0
Регистрация: 05.11.2016
Сообщений: 8
09.11.2016, 20:09  [ТС]     Скорость COM порта #7
Это все здорово, но даже в моем конкретном случае в связке ATMEGA328p и FT232BM не могу задать скорость даже 921600 bps. Откуда и вопрос.
Проблема низкой скорости кроется в стандартной прошивке МК?

В которой фигурируют следующие строки (Выдержка из Board.txt):
uno.upload.speed=115200
uno.bootloader.low_fuses=0xFF
uno.bootloader.high_fuses=0xDE
uno.bootloader.extended_fuses=0x05
Или в каких других параметрах?

Хотелось бы получить помощь в настройке, сухой теории я перечитал выше крыши только толку мало.
northener
3064 / 2121 / 438
Регистрация: 15.07.2013
Сообщений: 12,314
11.11.2016, 02:13     Скорость COM порта #8
Цитата Сообщение от quwy Посмотреть сообщение
При чем тут мелкомягкие? Программный интерфейс UART в персональных компьютерах изначально работал с дискретным набором скоростей еще со времен XT и 8250.
Ага. Но почему набор скоростей такой скудный для 8250? Всего 9 скоростей!
Делитель скорости двухбайтный. Частота системных часов 119000Гц. Ну кто мешает задать любую скорость в таких пределах?
quwy
Native x86
3132 / 1980 / 527
Регистрация: 13.02.2013
Сообщений: 6,628
11.11.2016, 16:41     Скорость COM порта #9
Цитата Сообщение от northener Посмотреть сообщение
Ага. Но почему набор скоростей такой скудный для 8250? Всего 9 скоростей!
А вам мало? Можете назвать хоть один пример, когда нужна нестандартная скорость в том диапазоне, который поддерживает 8250?

Вы понимаете, что реальное устройство, ожидающее, скажем, 19200 bps не сможет отличить их от 19201 и даже от 19250 bps. Но зато где-то в районе 19480 начнет хитро подглючивать из-за искажений, вызванных несинхронностью передатчика и приемника. Зачем нам этот геморрой, если можно жестко задать "стандартные" битрейты, среди которых рядом с 19200 есть 28800 и 14400?
northener
3064 / 2121 / 438
Регистрация: 15.07.2013
Сообщений: 12,314
11.11.2016, 18:44     Скорость COM порта #10
Цитата Сообщение от quwy Посмотреть сообщение
Можете назвать хоть один пример, когда нужна нестандартная скорость
Например хочу получить на выходе порта меандр произвольной частоты
quwy
Native x86
3132 / 1980 / 527
Регистрация: 13.02.2013
Сообщений: 6,628
11.11.2016, 18:48     Скорость COM порта #11
Цитата Сообщение от northener Посмотреть сообщение
Например хочу получить на выходе порта меандр произвольной частоты
Это не задача COM-порта.
northener
13.11.2016, 01:13
  #12

Не по теме:

Цитата Сообщение от quwy Посмотреть сообщение
Это не задача COM-порта.
Ну а почему бы мелкомягким не предложить бы в начале пути (в MS-DOS) - СОМ-порт-EX? Микросхема-то позволяет!
Было у меня когда-то давно желание сделать максимально возможную скорость последовательного порта на контроллере с 51-м процессором. Но вот незадача. Кварц там стоял не кратный 11.059

quwy
Native x86
3132 / 1980 / 527
Регистрация: 13.02.2013
Сообщений: 6,628
13.11.2016, 02:44     Скорость COM порта #13
Цитата Сообщение от northener Посмотреть сообщение
Ну а почему бы мелкомягким не предложить бы в начале пути (в MS-DOS) - СОМ-порт-EX? Микросхема-то позволяет!
Так я привел уже пример ситуации, когда это станет источником проблем. Генератор меандра произвольной частоты в составе PC был изначально (и только сейчас его начали выпиливать за ненадобностью) -- это спикер. Кстати, управляющие линии того же COM-порта позволяют генерировать прямоугольники с произвольной частотой и скважностью.
northener
15.11.2016, 01:57
  #14

Не по теме:

Цитата Сообщение от quwy Посмотреть сообщение
Генератор меандра произвольной частоты в составе PC был изначально (и только сейчас его начали выпиливать за ненадобностью) -- это спикер.
А как я был должен до него добраться?
Цитата Сообщение от quwy Посмотреть сообщение
Кстати, управляющие линии того же COM-порта позволяют генерировать прямоугольники с произвольной частотой и скважностью.
А где мне было взять таймер с такой точностью?

MrTimmy
0 / 0 / 0
Регистрация: 05.11.2016
Сообщений: 8
15.11.2016, 20:24  [ТС]     Скорость COM порта #15
Проблема частично решена.

Достал осциллограф, посмотрел что выплевывает мк и компьютер. Все сходится с тем что задавал в программе (т.е. скорость 2 Mbps).
Стал искать дальше и обнаружил что один цикл работы программы равен ~1мс. Методом исключения выяснилось, что во всем виновата стандартная функция:

C
1
2
3
4
5
6
7
BOOL WriteFile(
  HANDLE hFile,             
  LPCVOID lpBuffer,             
  DWORD nNumberOfBytesToWrite,     
  LPDWORD lpNumberOfBytesWritten,  
  LPOVERLAPPED lpOverlapped        
);
Раз уж тут дело, как я понимаю, со стороны ПО, не могли бы пояснить в чем причина столь долгой отправки байта?

З.Ы. При инициализации порта все таймауты выставлены в 0.
З.Ы.Ы. Простите за корявое оформление и спасибо за правку =)
northener
3064 / 2121 / 438
Регистрация: 15.07.2013
Сообщений: 12,314
16.11.2016, 02:23     Скорость COM порта #16
Цитата Сообщение от MrTimmy Посмотреть сообщение
не могли бы пояснить в чем причина столь долгой отправки байта?
Что значит "долгая отправка байта"?
Байты как раз отправляются как им и положено без всяких проблем. Вот многобайтовые посылки действительно отправляются "как Винда захочет". И замечено это должно было быть на любом компьютере с ОС Windows.
MrTimmy
0 / 0 / 0
Регистрация: 05.11.2016
Сообщений: 8
16.11.2016, 17:57  [ТС]     Скорость COM порта #17
Цитата Сообщение от northener Посмотреть сообщение
Что значит "долгая отправка байта"?
В цикле была забита отправка 1 байта. Время выполнения 1 цикла если точнее то 0,1 мс.
Не думаю что это нормальная скорость передачи.

Должно же быть адекватное объяснение такой задержки на выполнение функции.

З.Ы. Со стороны МК все работает отлично, во всяком случае отправляет все на заявленной скорости.
northener
3064 / 2121 / 438
Регистрация: 15.07.2013
Сообщений: 12,314
16.11.2016, 19:22     Скорость COM порта #18
Так Винда всё-таки не ОС реального времени. У нее много всякой другой работы кроме этого цикла.
MrTimmy
0 / 0 / 0
Регистрация: 05.11.2016
Сообщений: 8
16.11.2016, 21:06  [ТС]     Скорость COM порта #19
Цитата Сообщение от northener Посмотреть сообщение
Так Винда всё-таки не ОС реального времени. У нее много всякой другой работы кроме этого цикла.
Причем тут реального времени или нет. Это просто посылка без каких либо отчетов о передачи.
Судя по вашему ответу можно сказать, что на флешку информация должна кидаться днями если не месяцами, ведь у системы есть БОЛЕЕ важные задачи.
Ну и прием информации идет каким то магическим образом без задержек, на это видимо нет необходимости затрачивать ресурсы системы.

Думаю на этом тему можно закрывать. Если люди имеющие представление о данном вопросе имеются то они явно не заглядывали в эту тему.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2016, 01:28     Скорость COM порта
Еще ссылки по теме:

Определить скорость изменения сигнала на входе порта - Микроконтроллеры
Продолжаю изучать Микроконтролеры.Такой вопрос. На одни из портов Контролера поступает сигнал с определенной частотой (01010101010101)...

Вычислить путь пройденной лодкой, если известна её собственная скорость и скорость течения - C (СИ)
1. Лодка перемещается сначала по течению реки, а затем против течения. Вычислить путь пройденной лодкой, если её скорость в стоячей воде v...

[Арканоид] Как вычислить скорость по X и Y имея угол направления шара и скорость движения? - Графика и игры
Пишу арканоид(C++, SDL). Нашол формулу для определения угла с каким надо отразить шар от ракетки, в формуле если шар попадает в центр...

Создание тестов на скорость чтения и скорость записи - C++/CLI WinForms
Проблемка такая - пишу простенький тест на скорость записи и скорость чтения, локальных и съемных дисков. Как написать тесты вроде...

Собственная скорость катера и скорость течения - Механика
От пристани A одновременно вышли вниз по течению катер и плот. Катер прошел 96км, потом повернуд назад и вернулся в А через 14ч. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
northener
3064 / 2121 / 438
Регистрация: 15.07.2013
Сообщений: 12,314
17.11.2016, 01:28     Скорость COM порта #20
Цитата Сообщение от MrTimmy Посмотреть сообщение
Причем тут реального времени или нет. Это просто посылка без каких либо отчетов о передачи.
Дело не в посылке, а в цикле. Сама то посылка занимает ровно столько положено. А вот между двумя соседними вызовами WriteFile проходит сколько-то времени.

А прием тут ни при чем. Принимает данные сначала микросхема, затем драйвер. Так что тут задержкам взяться неоткуда.

Добавлено через 2 часа 54 минуты
Цитата Сообщение от MrTimmy Посмотреть сообщение
Думаю на этом тему можно закрывать.
Темы на этом форуме закрывают только при нарушении правил форума. А вот обсуждение её действительно стоит прекратить до той поры пока вы не вникните достаточно глубоко в принципы работы современных многозадачных операционных систем типа Windows.

Не по теме:

P.S.
Пишу программы для микропроцессоров и программы для связи с ними РС с начала 90-х.

P.P.S.
И кстати. Теоретически копирование на флешку в цикле по одному байту за итерацию цикла действительно может

Цитата Сообщение от MrTimmy Посмотреть сообщение
кидаться днями если не месяцами!
Примите и прочь.

Yandex
Объявления
17.11.2016, 01:28     Скорость COM порта
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru