Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi и WinAPI

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

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

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

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

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

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

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

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

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

спецификация COM порта - Delphi
Такая фишка. На Ком порту 2 проводка соеденены. Если их соединения размыкается, то мне нужно вывести какое нить сообщение. Кто нибудь...

Отслеживание 80 порта - Delphi
Помогите тогда вот с чем. Как мне сделать так, чтобы когда пользователь запускает Internet и нажал на кнопку коннект, отслеживать, куда...

Эмулятор COM порта - Delphi
Всем привет... Мне нужен эмулятор COM порта. Может у кого то есть скиньте пожайлуста, мне ссилку в Интернете, а то я ни как не могу...

Ввод из COM порта - Delphi
Подскажите, как правильно осуществить ввод из COM-порта - дело в том, что когда данных в буфере порта нет, функция ReadFile (Windows API)...

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

Неправильное чтение COM-порта - Delphi WinAPI
День добрый, Столкнулся с непонятной для меня проблемой, пишу программу для обработки данных со сканера штрих-кодов, данные со штрих-кода...

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

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

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

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

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

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

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

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

MrTimmy, большинство COM-портов на современной базе поддерживают скорости до 921600 bps. Даже если стандартные не поддерживают, всегда можно взять отдельный контроллер.
0
MrTimmy
0 / 0 / 0
Регистрация: 05.11.2016
Сообщений: 8
09.11.2016, 20:09  [ТС] #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
Или в каких других параметрах?

Хотелось бы получить помощь в настройке, сухой теории я перечитал выше крыши только толку мало.
0
northener
пофигист широкого профиля
3149 / 2202 / 467
Регистрация: 15.07.2013
Сообщений: 12,861
11.11.2016, 02:13 #8
Цитата Сообщение от quwy Посмотреть сообщение
При чем тут мелкомягкие? Программный интерфейс UART в персональных компьютерах изначально работал с дискретным набором скоростей еще со времен XT и 8250.
Ага. Но почему набор скоростей такой скудный для 8250? Всего 9 скоростей!
Делитель скорости двухбайтный. Частота системных часов 119000Гц. Ну кто мешает задать любую скорость в таких пределах?
0
quwy
Native x86
3305 / 2152 / 587
Регистрация: 13.02.2013
Сообщений: 7,156
11.11.2016, 16:41 #9
Цитата Сообщение от northener Посмотреть сообщение
Ага. Но почему набор скоростей такой скудный для 8250? Всего 9 скоростей!
А вам мало? Можете назвать хоть один пример, когда нужна нестандартная скорость в том диапазоне, который поддерживает 8250?

Вы понимаете, что реальное устройство, ожидающее, скажем, 19200 bps не сможет отличить их от 19201 и даже от 19250 bps. Но зато где-то в районе 19480 начнет хитро подглючивать из-за искажений, вызванных несинхронностью передатчика и приемника. Зачем нам этот геморрой, если можно жестко задать "стандартные" битрейты, среди которых рядом с 19200 есть 28800 и 14400?
0
northener
пофигист широкого профиля
3149 / 2202 / 467
Регистрация: 15.07.2013
Сообщений: 12,861
11.11.2016, 18:44 #10
Цитата Сообщение от quwy Посмотреть сообщение
Можете назвать хоть один пример, когда нужна нестандартная скорость
Например хочу получить на выходе порта меандр произвольной частоты
0
quwy
Native x86
3305 / 2152 / 587
Регистрация: 13.02.2013
Сообщений: 7,156
11.11.2016, 18:48 #11
Цитата Сообщение от northener Посмотреть сообщение
Например хочу получить на выходе порта меандр произвольной частоты
Это не задача COM-порта.
0
northener
13.11.2016, 01:13
  #12

Не по теме:

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

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

Не по теме:

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

0
MrTimmy
0 / 0 / 0
Регистрация: 05.11.2016
Сообщений: 8
15.11.2016, 20:24  [ТС] #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.
З.Ы.Ы. Простите за корявое оформление и спасибо за правку =)
0
15.11.2016, 20:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2016, 20:24
Привет! Вот еще темы с ответами:

Опрос состояния порта принтера - Delphi
Помогите выполнить сабж

Программа для прослушивания открытого порта. - Delphi
В общем есть приложение - которое открыло порт и общается по нему... Могу ли я Написать прогу - которая бы могла 'прослушивать' этот порт...

Как написать драйвер вирт. com-порта ??? - Delphi
Как написать драйвер, чтобы com5,например, появился. Пишешь в порт, данные в программу передаются.

Программа, которая принимала бы данные с com-порта - Delphi
Помогите! Нужно написать прогу которая принимала бы данные с com-порта (от мини АТС)


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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