| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Как работать с ком-портом из под Delphi? |
| Автор: Alexzz 2.10.2007, 14:53 |
| Возникла необходимость работать с устройством подключенным через ком-порт. Искал в хелпах, искал тут по форуму но что-то ничего не нашёл. Предполагаю что где-то есть эта инфа, просто не умею найти. Не судите строго, просто ткните меня в неё носом. |
| Автор: Alexeis 2.10.2007, 15:09 |
| Например тут http://forum.vingrad.ru/index.php?showtopic=36936 Добавлено через 3 минуты и 35 секунд Еще тут http://forum.vingrad.ru/index.php?show_type=faq&showtopic=155934 http://forum.vingrad.ru/index.php?show_type=faq&showtopic=155933 http://forum.vingrad.ru/index.php?show_type=faq&showtopic=155928 http://forum.vingrad.ru/index.php?show_type=faq&showtopic=155927 http://forum.vingrad.ru/index.php?show_type=faq&showtopic=155924 |
| Автор: Felan 3.10.2007, 08:23 |
| http://forum.sources.ru/index.php?showtopic=173025&view=findpost&p=1462984 |
| Автор: Alexzz 3.10.2007, 08:41 |
| Ага, спасибки, на досуге буду разбираться. |
| Автор: Alexzz 6.10.2007, 11:47 |
| Ну вот, удалось мне заставить моё внешнее устройство мне ответить. Примерно как в том анекдоте про кгбшников и тутанхамона - "Сам сознался". Но вот есть ещё одна маленькая проблемка. Устройство оказалось капризное, и если ему посылать байты сразу скопом, то оно их "не ест". Ему понимаешь подавай байтики с интервалами по 18мс. Что я сделал - организовал отправку байтов из выходного буфера по событию таймера. На каждом событии проверяется длина буфера, если не ноль - первый байт из буфера отправляется в порт, буфер сдвигается на 1 байт и на 1 уменьшается размер. Ну вобщем всё простенько. Проблема заключается в том, что невозможно даже близко подогнать интервал к 18мс. Самый меньший интервал которого удаётся добиться около 200мс. Это 5 байт уходят за секунду. Если я меняю значение интервала таймера меньше 200, то это абсолютно ничего не меняет. Такое ощущение, что таймер просто не умеет срабатывать чаще 5ти раз в секунду. Вопрос к знатокам: Есть ли другая возможность отсылать байты в ком-порт с интервалом 18мс? Может какое свойство ком-порта установить, или ещё что... |
| Автор: Alexeis 6.10.2007, 12:44 |
| Таймер способен генерировать события с частотой не чаще 100 запусков в секунду с точностью 10мс, т.е. можно через каждые 20мс. |
| Автор: Alexzz 6.10.2007, 12:58 |
| Ну вот не даёт он 20мс. Только 200. Какой-то неправильный таймер... |
| Автор: Alexeis 6.10.2007, 13:41 |
| Таймер то правильный и 1000 раз проверенный. Значит ошибка не в таймере. |
| Автор: Alexzz 6.10.2007, 18:15 |
| Таймер не таймер, но через таймер не получается. |
| Автор: ivan219 6.10.2007, 18:41 |
| Возможно что само устройство перестаёт принимать байты если проходит больше чем время на отпровление одного байта после стоп бита предидущего байта попробуй поиграть со скоростью обмена, также может нет синхронизации. А что за устройство? И если можно то код в студию. |
| Автор: Alexzz 6.10.2007, 23:50 | ||
| Нет, устройство то работает. Оно не воспринимает байты только если их отсылать слишком часто. Оригинальный софт для этого устройства позволяет менять интервал, и если выставить интервал 10мс то устройство больше не отвечает. Написанная мной программа уже работает с этим устройством, но намнооого медленнее чем хотелось бы. Устройство это микроконтроллер, управляющий неким прибором. Интервал между посылками нужен очевидно просто для того, чтобы процессор успевал считывать данные из регистров и обрабатывать их. Код я взял из первых ссылок, что дал Alexeis. Буквально немного подправил.
|
| Автор: ivan219 7.10.2007, 08:19 |
| А верхняя граница времени после которой МК сщитае что весь пакет пришол есть? или он ждёт пока непредёт определённое количество байт. Сколько байт в пакете? А какая скорость обмена у МК и COM порта? Скорей всего таймер срабатывает чётко а вот сам поток немного задержевается что приводит к TimeOut у МК и он считает что пакет битый. В какой Windows работаешь? |
| Автор: Alexzz 7.10.2007, 09:09 |
| Опять ты не понял. РАБОТАЕТ моя программа. Не считает никто ничего битым. ВСЁ РАБОТАЕТ. Только очень медленно. На верхний предел не испытывал. Скорость 9600. Пакеты разные, но все нормально проходят. Только медленно. Пакет из 5 байт идёт секунду. А если учесть что нужно передать всего 8кб данных разбив их по пакетам и снабдив всеми начальными и конечными байтиками, да ещё и ответы надо принять, вот и сидим, пол часа ждём пока всё запишется. Винды - проверял и под 98 и под ХРенью. Работает одинаково. Очень медленно. |
| Автор: ivan219 7.10.2007, 09:30 |
| Ну хорошо не допонял. В таймере свойство Interval 200 а при меньших значениях ничего не работает, тогда проблема гдето в коде. |
| Автор: ivan219 7.10.2007, 09:56 |
| Попробуй этот компонент http://calculator2006.narod.ru/file/AsyncFree104.rar |
| Автор: ivan219 7.10.2007, 10:13 |
| На компонент есть документация в архиве. Но пример выложу. |
| Автор: ivan219 7.10.2007, 10:15 |
| P.S. я COM1 и COM2 соединил Nul-modem кабелем. |
| Автор: Alexzz 8.10.2007, 12:18 | ||
И опять ты не понял. Всё работает. Но уменьшение интервала меньше чем 200 ничего не ускоряет. Прога продолжает работать всё так-же медленно. Вобщем проблему решил. Отказался вообще от таймера как такового. Написал линейный алгоритм работы с устройством, в качестве задержки использовал sleep(18);. Работает нормально, быстро, почти как и родной софт. |
| Автор: ivan219 8.10.2007, 20:27 |
Я про то что в гдето в коде происходит задержка. Тоже вареант. Я тебе компонент дал и пример попробуй может понравится |
| Автор: Alexzz 9.10.2007, 00:44 |
| Ну, я за эти дни уже так далеко продвинулся с этой прогой, что уже что либо менять будет значить всё это заново переписывать. Ну уж нет... Файлик конечно гляну на досуге. |
| Автор: DonPager 10.10.2007, 00:47 |
| Alexzz, а твой МК DSR дёргает ? ИМХО лучше по упр сигналам отсылать чем по таймерам... |
| Автор: Alexzz 10.10.2007, 01:00 |
| Связь только по двум линиям, TX и RX через два оптрона. Нет никаких управляющих сигналов. |
| Автор: ivan219 10.10.2007, 07:38 |
Нет лучше протокол составить так чтобы дополнительные вывода не использовать. |
| Автор: Alexzz 16.1.2008, 00:42 | ||
| Возвращаемся к теме. Прогу уже успел распространить нескольким коллегам. И тут вдруг выяснилось, что моя прога не желает работать под XP. У меня самого стоит 98 и прога работает с устройством через ком-порт на ура. Но у коллег стоит ХР и прога работать отказывается, мало того, вываливается в ошибку. НО!!! Если предварительно запустить оригинальный заводской софт для устройства, то и моя прога после этого начинает корректно работать с устройством. Вопрос: В чём разница в работе с ком-портом между 98 и ХР ? Я пока ещё не отлаживал прогу под ХР просто потому, что ХР у меня только на ноуте но там нет ком-порта. Просто гонял прогу без подключения к порту - всё о.к. Коллеги, у которых прога не пошла, утверждают, что по светодиодам на устройстве видно, что прога передаёт данные в устройство но нет ответа. Отсутствие ответа означает, что формат посылаемых данных не соответствует протоколу. А вот что именно, я пока не выяснил. Предполагаю что сбой происходит в момент когда я задаю конфигурацию порта. Делаю это так:
Да, и ещё один момент который я смог уловить и на своём компе при отладке: Закрытие порта командой CloseHandle(hport) под ХР вызывает ошибку. Под 98 всё нормально. |
| Автор: ivan219 16.1.2008, 01:48 |
| Возможно потому что из под 98 можно осуществить прямой доступ к порту а вот XP не разрешает. |
| Автор: remax 18.1.2008, 01:01 |
| Я что-то не пойму, зачем бороться с какими-то сложностями, если есть замечательный компонент http://sourceforge.net/projects/tpapro/ Работает во всех операционках. Все что только можно придумать - настраивается! Добавлено через 13 минут и 51 секунду Тоже не вопрос - используй преходник USB <> COM. (Такие еще в дата-кабелях к мобильникам стоят). Сделай сам или, если с электроникой не в теме, - попроси своих друзей-электронщиков. Я пользуюсь переходником сделанным моим другом. С ним можно связаться на сайте его фирмы: http://cont.biz/. Не сочтите это рекламой. |