Вверх ↑
Этот топик читают: Гость
Ответов: 8930
Рейтинг: 823
#31: 2011-11-26 20:27:21 ЛС | профиль | цитата
Tomset91, физически каналы приёма и передачи данных разделены (контакты 2 и 3 разъёма COM) Приём данных и запись их в буфер происходит независимо от пользователя, когда пользователь подаёт команду на приём -- читается не сам порт, а его буфер -- самые первые байты в количестве, которое указал пользователь в своей команде. (Буфер не бесконечен, по умолчанию 512 байт, поэтому между скоростью порта, частотой считывания и количеством считываемых байт должно быть соответствие, например при установленной скорости 9600 бит/сек, что равно 960 байт/сек (байт=8 бит + 1 старт + 1 окончание=10 бит/байт) и установленном размере считывания 32 байта, период считывания должен быть не менее 1/(960/32)=32 миллисек. Чаще обращатся к порту -- излишне нагружать компьютер, реже -- в буфере пропадут не считанные данные.
Tomset91 писал(а):
точки onWrite и doRead просто соединены между собой
Только в случае соединения контактов "2" и "3"
порта, или открытия одного порта дважды, один на передачу, второй на приём и "тихо сам с собою вести беседу"
карма: 19

0
Ответов: 51
Рейтинг: 3
#32: 2011-11-26 20:59:22 ЛС | профиль | цитата
Леонид, если этот буфер есть то почему не запоминает? Запускаю программу отправляю данные в порт, потом жму кнопку sent тем самым активирую передачу и приём данных но почему то в окне приёма пусто, тоесть данные не считываются из буфера как будто его там и нет... они считываются если постоянно отправлять данные в порт и в этот момент кликать кнопкой sent и то срабатывает не при каждом нажатие, есть потери...
Только в случае соединения контактов "2" и "3"
порта, или открытия одного порта дважды, один на передачу, второй на приём и "тихо сам с собою вести беседу"
А вот и нет, программа ведёт себя аналогично... тоесть считывает данные с контроллера причём ошибок нет, но передаю всего по одному байту с перерывом 1с для наглядность появления цифр в окне приёма.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#33: 2011-11-26 21:07:08 ЛС | профиль | цитата
[offtop]
Леонид писал(а):
в буфере пропадут не считанные данные

Ну, честно говоря, они в буфер не попадают вообще, они просто не регистрируются. Причина в наглом упрощении спецификации RS232 в 99.9% популярных устройств: не используются по назначению шины DSR и DTR. Шины закорачиваются и даже порою используются для питания логики. Естественно, отсылающая сторона думает, что принимающая всегда готова и шлёт напропалую. По работе приходилось не раз иметь дело вообще с двумя проводками - общим и замкнутыми RX и TX, этакая симплексная шина, бюджетный вариант.[/offtop]
карма: 1

0
Ответов: 51
Рейтинг: 3
#34: 2011-11-26 21:29:03 ЛС | профиль | цитата
Так всё же мне до сих пор не понятна связь между onWrite и doRead, по сути и она тут не нужна, я просто должен кликать точку doRead чтобы прочитать порт, причём чтобы не потерять данные - скорость кликанья должна быть высокой а это нагрузка на компьютер... Но как работают другие терминалы если там использую теже самые TX и RX, буферы как отметил товаришь 1nd1g0 не регистрируются, а данные считываются все до единого без потерь и нагрузки на комп как таковой я вообще не вижу... А если вспомнить:
Порты могут вырабатывать аппаратные прерывания IRQ4 (обычно используются для COM1 и COM3) и IRQ3 (для COM2 и COM4).
А это говорит о том что компонент сделан вообще неправильно... и точка doRead в нём и ненужна вообще, данные он должен считывать не когда кто-то кликнет по doRead, а когда они поступят в порт тем самым произойдёт прерывание.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#35: 2011-11-26 21:35:06 ЛС | профиль | цитата
Tomset91 писал(а):
Порты могут вырабатывать аппаратные прерывания IRQ4

А вот предвидя такой поворот разговора я и говорил Вам с самого начала темы, в самом первом посте: это - СИНХРОННЫЙ вариант работы с портом, если Вы хотите, чтобы порт САМ обращался к Вашей программе, когда ему есть что сказать - добро пожаловать в ПОИСК по форуму, сверху этой страницы. Ищите НЕСТАНДАРТНЫЕ компоненты для АСИНХРОННОЙ работы с портом. И готовьтесь к тому, что Вам светят серьёзные подводные камни, так как там в дело вступает многопоточное программирование, потенциальные конфликты доступа к данным и т.д. Разработчики не по глупости оставили синхронный вариант, подозреваю, им просто было лень ловить многочисленные глюки и отвечать на сотни жалоб на форуме по поводу побочных эффектов колбэков из параллельных потоков с другим контекстом.
карма: 1

0
Гость
Ответов: 17029
Рейтинг: 0
#36: 2011-11-26 21:41:47 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2025-01-09 16:06:07
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#37: 2011-11-26 21:48:18 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2025-01-09 16:06:07
карма: 0

0
Ответов: 3889
Рейтинг: 362
#38: 2011-11-26 21:48:46 ЛС | профиль | цитата
[flood]
г. ость писал(а):
аргумент содержащий в своём теле слово "могут" считается аргументом?

Строго говоря это зависит от операционной системы, современная тенденция - отключать все прерывания, которые только можно (можно, правда, не все) и эмулировать их работу, но на старых системах такое утверждение ещё справедливо, так что не буду цепляться к словам и читать нотации, по теме я ему ответил.[/flood]
карма: 1

0
Ответов: 51
Рейтинг: 3
#39: 2011-11-26 21:55:02 ЛС | профиль | цитата
Разработчики не по глупости оставили синхронный вариант, подозреваю, им просто было лень ловить многочисленные глюки и отвечать на сотни жалоб на форуме по поводу побочных эффектов колбэков из параллельных потоков с другим контекстом.
Почему бы этим разработчикам не создать простой компонент с одним выходом который регистрирует прерывания IRQ4 и IRQ3 (выбираем в свойствах) и при подключении ко входу doRead превращает компонент в полноценный ком порт с которым можно работать, а глюки устраняются запрешением прерываний в ответственных местах а также push / pop
карма: 0

0
Ответов: 1376
Рейтинг: 197
#40: 2011-11-26 22:08:11 ЛС | профиль | цитата
Tomset91, а можно переопределить события на другие прерывания?
карма: 1

0
Ответов: 51
Рейтинг: 3
#41: 2011-11-26 22:17:09 ЛС | профиль | цитата
г. ость писал(а):
непонимание связи между onWrite и doRead пахнет троллингом
А вот действительно не могу понять зачем в справке они взязаны к тому же через задержку, когда onWrite - всего лишь число переданных байт и не нужно его никада привязывать. А doRead вход кликая который мы вызываем чтение данных поступающих в порт.
------------ Дoбавленo в 22.17:
foksov писал(а):
Tomset91, а можно переопределить события на другие прерывания?
непонимаю смысла сообщения? прерывание вроде и есть событие можно вроде только само прерывание привязать к другой подпрограмме которое его обработает..
карма: 0

0
Ответов: 1376
Рейтинг: 197
#42: 2011-11-26 22:26:33 ЛС | профиль | цитата
Tomset91 писал(а):
можно вроде только само прерывание привязать к другой подпрограмме
золотые слова! И что? Делать компонент регистрирующий все прервывания в системе?
карма: 1

0
Ответов: 51
Рейтинг: 3
#43: 2011-11-26 22:35:47 ЛС | профиль | цитата
foksov писал(а):
И что? Делать компонент регистрирующий все прервывания в системе?
Было бы не плохо если кто-то сделает, а вообще меня пока интересуют только два IRQ4 и IRQ3... хотя если компонент то просто в свойствах выбирать IRQ1 - IRQ(n), и надо наверно ещё делать второй компонент который будет эти прерывания запрещать/разрешать на отдельных участках как вообще все полностью все, так и какое то одно указанное..
карма: 0

0
Ответов: 8930
Рейтинг: 823
#44: 2011-11-26 22:44:25 ЛС | профиль | цитата
Tomset91, можно сделать по всякому, но нужно принимать компоненты HiAsm такими, какие есть, хотя бы на этапе знакомства.
Утановите на doRead таймер и Вы получите данные из порта в непрерывном режиме без всякого "прерывания" (связь между временными установками выше).
1nd1g0 писал(а):
они просто не регистрируются
может и так (по теории), но на практике HiAsm-а (в своё время проверял имея на борту два COM порта) при меньшей скорости считывания пропадают не новые данные, а выданные раньше.
карма: 19

0
Ответов: 16884
Рейтинг: 1239
#45: 2011-11-26 22:49:52 ЛС | профиль | цитата
Tomset91, у компонента есть ещё две точки, которые служат для управления : doDTR и doRTS.
А для любимых IRQ4 и IRQ3 примени IC (если система позволит)

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)