Tomset91 писал(а):
точки onWrite и doRead просто соединены между собойпорта, или открытия одного порта дважды, один на передачу, второй на приём и "тихо сам с собою вести беседу"
Ответов: 8930
Рейтинг: 823
|
|||
Tomset91, физически каналы приёма и передачи данных разделены (контакты 2 и 3 разъёма COM) Приём данных и запись их в буфер происходит независимо от пользователя, когда пользователь подаёт команду на приём -- читается не сам порт, а его буфер -- самые первые байты в количестве, которое указал пользователь в своей команде. (Буфер не бесконечен, по умолчанию 512 байт, поэтому между скоростью порта, частотой считывания и количеством считываемых байт должно быть соответствие, например при установленной скорости 9600 бит/сек, что равно 960 байт/сек (байт=8 бит + 1 старт + 1 окончание=10 бит/байт) и установленном размере считывания 32 байта, период считывания должен быть не менее 1/(960/32)=32 миллисек. Чаще обращатся к порту -- излишне нагружать компьютер, реже -- в буфере пропадут не считанные данные.
Tomset91 писал(а): точки onWrite и doRead просто соединены между собойпорта, или открытия одного порта дважды, один на передачу, второй на приём и "тихо сам с собою вести беседу" |
|||
карма: 19 |
|
Ответов: 51
Рейтинг: 3
|
|||
Леонид, если этот буфер есть то почему не запоминает? Запускаю программу отправляю данные в порт, потом жму кнопку sent тем самым активирую передачу и приём данных но почему то в окне приёма пусто, тоесть данные не считываются из буфера как будто его там и нет... они считываются если постоянно отправлять данные в порт и в этот момент кликать кнопкой sent и то срабатывает не при каждом нажатие, есть потери...
Только в случае соединения контактов "2" и "3"
А вот и нет, программа ведёт себя аналогично... тоесть считывает данные с контроллера причём ошибок нет, но передаю всего по одному байту с перерывом 1с для наглядность появления цифр в окне приёма.порта, или открытия одного порта дважды, один на передачу, второй на приём и "тихо сам с собою вести беседу" |
|||
карма: 0 |
|
Ответов: 3889
Рейтинг: 362
|
|||
[offtop]
Леонид писал(а): в буфере пропадут не считанные данныеНу, честно говоря, они в буфер не попадают вообще, они просто не регистрируются. Причина в наглом упрощении спецификации RS232 в 99.9% популярных устройств: не используются по назначению шины DSR и DTR. Шины закорачиваются и даже порою используются для питания логики. Естественно, отсылающая сторона думает, что принимающая всегда готова и шлёт напропалую. По работе приходилось не раз иметь дело вообще с двумя проводками - общим и замкнутыми RX и TX, этакая симплексная шина, бюджетный вариант.[/offtop] |
|||
карма: 1 |
|
Ответов: 51
Рейтинг: 3
|
|||
Так всё же мне до сих пор не понятна связь между onWrite и doRead, по сути и она тут не нужна, я просто должен кликать точку doRead чтобы прочитать порт, причём чтобы не потерять данные - скорость кликанья должна быть высокой а это нагрузка на компьютер... Но как работают другие терминалы если там использую теже самые TX и RX, буферы как отметил товаришь 1nd1g0 не регистрируются, а данные считываются все до единого без потерь и нагрузки на комп как таковой я вообще не вижу... А если вспомнить:
Порты могут вырабатывать аппаратные прерывания IRQ4 (обычно используются для COM1 и COM3) и IRQ3 (для COM2 и COM4). А это говорит о том что компонент сделан вообще неправильно... и точка doRead в нём и ненужна вообще, данные он должен считывать не когда кто-то кликнет по doRead, а когда они поступят в порт тем самым произойдёт прерывание. |
|||
карма: 0 |
|
Ответов: 3889
Рейтинг: 362
|
|||
Tomset91 писал(а): Порты могут вырабатывать аппаратные прерывания IRQ4А вот предвидя такой поворот разговора я и говорил Вам с самого начала темы, в самом первом посте: это - СИНХРОННЫЙ вариант работы с портом, если Вы хотите, чтобы порт САМ обращался к Вашей программе, когда ему есть что сказать - добро пожаловать в ПОИСК по форуму, сверху этой страницы. Ищите НЕСТАНДАРТНЫЕ компоненты для АСИНХРОННОЙ работы с портом. И готовьтесь к тому, что Вам светят серьёзные подводные камни, так как там в дело вступает многопоточное программирование, потенциальные конфликты доступа к данным и т.д. Разработчики не по глупости оставили синхронный вариант, подозреваю, им просто было лень ловить многочисленные глюки и отвечать на сотни жалоб на форуме по поводу побочных эффектов колбэков из параллельных потоков с другим контекстом. |
|||
карма: 1 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 2 раз(а), последний 2025-01-09 16:06:07 |
|||
карма: 0 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 2 раз(а), последний 2025-01-09 16:06:07 |
|||
карма: 0 |
|
Ответов: 3889
Рейтинг: 362
|
|||
[flood]
г. ость писал(а): аргумент содержащий в своём теле слово "могут" считается аргументом?Строго говоря это зависит от операционной системы, современная тенденция - отключать все прерывания, которые только можно (можно, правда, не все) и эмулировать их работу, но на старых системах такое утверждение ещё справедливо, так что не буду цепляться к словам и читать нотации, по теме я ему ответил.[/flood] |
|||
карма: 1 |
|
Ответов: 51
Рейтинг: 3
|
|||
Разработчики не по глупости оставили синхронный вариант, подозреваю, им просто было лень ловить многочисленные глюки и отвечать на сотни жалоб на форуме по поводу побочных эффектов колбэков из параллельных потоков с другим контекстом.
Почему бы этим разработчикам не создать простой компонент с одним выходом который регистрирует прерывания IRQ4 и IRQ3 (выбираем в свойствах) и при подключении ко входу doRead превращает компонент в полноценный ком порт с которым можно работать, а глюки устраняются запрешением прерываний в ответственных местах а также push / pop |
|||
карма: 0 |
|
Ответов: 1376
Рейтинг: 197
|
|||
Tomset91, а можно переопределить события на другие прерывания?
|
|||
карма: 1 |
|
Ответов: 51
Рейтинг: 3
|
|||
г. ость писал(а): непонимание связи между onWrite и doRead пахнет троллингом
------------ Дoбавленo в 22.17: foksov писал(а): Tomset91, а можно переопределить события на другие прерывания? |
|||
карма: 0 |
|
Ответов: 1376
Рейтинг: 197
|
|||
Tomset91 писал(а): можно вроде только само прерывание привязать к другой подпрограмме |
|||
карма: 1 |
|
Ответов: 51
Рейтинг: 3
|
|||
foksov писал(а): И что? Делать компонент регистрирующий все прервывания в системе?
|
|||
карма: 0 |
|
Ответов: 8930
Рейтинг: 823
|
|||
Tomset91, можно сделать по всякому, но нужно принимать компоненты HiAsm такими, какие есть, хотя бы на этапе знакомства.
Утановите на doRead таймер и Вы получите данные из порта в непрерывном режиме без всякого "прерывания" (связь между временными установками выше). 1nd1g0 писал(а): они просто не регистрируются |
|||
карма: 19 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Tomset91, у компонента есть ещё две точки, которые служат для управления : doDTR и doRTS.
А для любимых IRQ4 и IRQ3 примени IC (если система позволит) |
|||
карма: 25 |
|