| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Com порт. Перекодировать принятый байт. |
| Автор: zi4rox 12.5.2009, 19:25 |
| Всем привет, Прошу помочь разобраться. Работаю с COM-портом, при помощи компоненты ComPort Library version 3.10, всё здорово, всё работает. Вот только загвоздка вот в чем: От устройства я принимаю байты (вида: 0х01 0хBA 0xFF ... - вобщем что угодно но только не символы), а этот компонент, да и другие подобные читают из ком порта именно символы. Как мне преобразовать строковый символ что я принял в реально переданный числовой байт? (попробывал StrToInt и т.п - не очень помогает) Добавлено через 14 минут и 40 секунд Попробывал через Byte() - но работает не на все символы. Вернее весь диапазон от 0х00 до 0хFF так передать не удастся, только те байты код символа которых существует |
| Автор: zi4rox 12.5.2009, 20:12 | ||
| Сейчас проверил обратную процедуру - вывел через Chr() все символы от 0х00 до 0хFF Все есть. Тогда получается всё глубже и запутаннее. Народ, кто из ком-порта читал, как боролись с этой проблемой. * Поставил при чтении сейчас:
Некоторые он нормально преобразует, а некоторые принятый байты - просто на просто срезает вообще и не отображает. Передается следующая последовательность: 0xFF 0x01 0x80 0x01 0x80 0x01 0x80 0x01 0x80 .... после преобразований получаю только: 255 1 1 1 1 1 .... [/code] |
| Автор: Keeper89 12.5.2009, 20:12 | ||
Подойдет?
Добавлено через 4 минуты и 23 секунды Кстати тоже работает, и прямо с префиксом '0x'. Что не помогает? |
| Автор: zi4rox 12.5.2009, 20:35 |
| C HexToInt никогда проблем не было, там вот как происходит дело: С ком-порта считывается символ в формате string. Так вот мне этот символ, что я считал необходимо преобразовать в число(десятиричное/шестнадцетиричное - без разницы.) Я опробывал конструкции по переводу символа в его числовой код [ф-ции Byte() , ord()], так вот - некоторые символы они переводят, а с некоторыми у них проблема и их попросту зарезает. Вот попробую со скриншотами: Вот как происходит прием и конвертация сейчас: http://ipicture.ru/ а вот как должно на самом деле(программа Terminal 1.9b): ![]() Как видно - 2 байта почему то сливаются в один, либо происходит неправильная конвертация символ-байт. Вобщем мне нужно добиться эффекта, как на 2ом скриншоте |
| Автор: Keeper89 12.5.2009, 20:40 |
Прием каких символом происходит? ASCII или какие? |
| Автор: zi4rox 12.5.2009, 20:50 |
| В Terminal - точно ASCII, а через компоненту не уверен. Написано что принимает строку и всё, в исходнике компоненты, тоже не нашел ничего путного. Если есть разные варианты, для разных форматов символов - скажите пожалуйста все - буду пробывать методом перебора |
| Автор: zi4rox 12.5.2009, 22:03 |
| Нашел причину сам: Всё работает на самом деле, и перекодировка идет нормально - ошибка вот в чем: Все эти компоненты для работы с ком портом: BCPort, Com Port Library - все они работают жутко медленно (если ставить задержку хотя бы в 1 милисекунду (а это ужасно долго) между отправляемыми данными - они не успевают различать принятые байты и лепят всё в одно) - вобщем в топку их. Пожалуйста посоветуйте максимально быстрый способ чтения/записи/работы с ком-портом? |
| Автор: kami 12.5.2009, 22:37 | ||
забыл добавить : Что используется в качестве хранилища для принятых байт - строки, буфер памяти, TStream - это личные трудности используемого компонента, и ничто не мешает перезагрузить их в любое другое хранилище. |
| Автор: Christoph 12.5.2009, 22:37 | ||
У меня тоже что то похожее...вот у меня есть программатор(почти готовый) написал прогу, можете проверить? с ком портом не работал...может автор выложит свой код, если можно
|
| Автор: zi4rox 12.5.2009, 22:58 |
| 2 kami Спасибо Вам огромное. Ваше объяснение натолкнуло на мысль. Сейчас уже в нужном направлении покопался - пока трудностей не вижу. Ещё раз спасибо Вам. 2Christoph Для своих тестов ком порта, я использовал один из примеров, что шел вместе с BComPort |
| Автор: dizJis 18.5.2009, 12:03 |
| Ребят, хотите совет? Если хотите научиться работать с com-портом, то забейте на компоненты, юзайте WinAPI, меньше проблем потом у вас будет. Я по началу тоже компоненты юзал, но в итоге отказался от них. Ручками порт проинициализировать, настроить, как тебе надо и работать с ним проще и быстрее |
| Автор: NewDima 18.5.2009, 12:09 |
| dizJis, ты юзал компоненты, пользовался боле высоким уровнем абстракции, научиться было проше, потом пошел уровнем ниже, сложнее. А остальным предлагаешь сразу на WinAPI писать? |
| Автор: dizJis 19.5.2009, 10:01 | ||
как раз таки наоборот |
| Автор: Gres 31.5.2009, 15:26 |
| Приветствую всех, похожая проблема с компонентом ComPort Library, тока версию последнюю поставил 4 бета. Вывожу данные через СОМ порт на железяку(пик контроллер), все замечательно выводится, НО... компонент выводит данные в ASCII коде... Посылаю "0", а на железяке получаю "48" , при посылке "1" получаю "49" и т.д. Программированием СОМ порта не занимался, вроде не сложно все, но не получается. Подскажите пожалуйста в чем моя ошибка или этот компонент предназначен только для работы в терминале? |
| Автор: kami 31.5.2009, 18:27 | ||||||
Дались вам всем побайтовые посылки... Посылай не символы, а байты. Дело в том, что символ "0" ни разу <> байт 0. Делай так:
или, если уж работаешь с символами, то:
|
| Автор: Gres 1.6.2009, 13:21 | ||
Спасибо Вам огромное за подсказку, в чем отличие символа от его кода я знаю В общем проблема была в компоненте ComPort Library, эта приблуда заточена специально для работы в режиме терминала(просто эмулирует нажатие клавиш), для отправки данных там всего две функции: Write и Writestr, в обоих функциях передаваемый параметр является типом PChar... В общем его получилось использовать со вторым методом предложенным Вами, но это слишком длинная и бесполезная работа(конвертировать символы туда и обратно). Пришлось "спрыгнуть с удобного кресла" под названием ComPort Library и вернуться к Win API, там с байтами все нормально работает... |
| Автор: kami 1.6.2009, 18:10 | ||
Вы просто его готовить не умеете. Хотя может и ошибаюсь - не пользовался этой библиотекой. Нужно смотреть на объявление функций Write и WriteStr. |
| Автор: Gres 5.6.2009, 07:48 | ||||||||
Прочитав Ваше сообщение решил проверить исходники этого компонента, хотя неблагодарное это дело перелапачивать горы исходного кода ради одной функции которую можно гораздо проще реализовать на Win API. Можно и свой компонент накидать, но для меня это разовая работа и пока в нем нет нужды, а скопировать кусок кода из своих же исходников при необходимости я всегда смогу Вот то, что я нашел в том компоненте:
Далее кусок из другого паса объявленного в этом:
Как видно из всего этого, данный компонент не пригоден для моих целей, его конечно можно подправить, но не стоит тратить на это время если есть другой способ. Все равно спасибо Вам большое за помощь, я ни когда не работал с СОМ портом, это первый опыт, да и задача не совсем стандартная или вернее совсем не стандартная, научить железяку(пик контролер, в который тоже ваяю код) общаться с большим братом
|
| Автор: kami 5.6.2009, 13:18 | ||
ошибочное мнение. |
| Автор: Gres 5.6.2009, 14:40 |
Ошибочное в чем? Поясните пожалуйста. Насколько я понял из исходников данная функция позволяет передавать только символ типа PAnsiChar или родственные ему. Мне нужно передать один байт(десятичное число от 0 до 255) и принять такой же ответ. Эта функция не позволяет записать байт в порт, она передает значение(числовое значение или код) символа или я ошибаюсь? Поясните в чем. Модераторам: спасибо за поправку, впредь буду учитывать. |
| Автор: kami 5.6.2009, 17:58 | ||
Позволяет.
|
| Автор: kami 5.6.2009, 23:36 | ||
| ай-я... не заметил const в описании Write... тогда так:
|
| Автор: Gres 6.6.2009, 07:12 |
Это практически тоже самое, что и во втором примере в верхнем посте на этой странице, как я и сказал оно работает нормально. Но для меня это лишнее преобразование, которое вызовет кучу перекодировки после приема... Просто компонент видимо еще сыроват, там есть функции внутри которые не доступны пользователю, но были бы очень интересны. Например, что мешает константу заменить на переменную и вывести ее наружу для смены типа посылаемых данных одним кликом... Изначально компонент использует вызовы все того же win api, просто как и все компоненты предназначен для более удобного использования и уменьшения рукописного труда разработчиков, тока заточен он изначально под терминальные (АТ) команды... |
| Автор: Yump 21.7.2009, 23:23 | ||||
| Подскажите, плз. Перешел на TComPort4Beta (Delphi2009) с CPortLib3.1.(Delphi2006) при асинхронном чтении из компорта в версии 3.1 можно было использовать любой тип в качестве буфера и я использовал такую конструкцию:
и дальше уже работаю с элементами массива... в 4-ой версии в качестве буфера можно использовать только TCPortBytes (PAnsiChar) и что-то я туплю, как с этим работать:
может кто-нибудь подсказать, что тут делать? |
| Автор: alex003 20.2.2010, 20:24 |
| Доброе время суток. Подскажите пожалуйста Надо получить архивы с прибора. Подключаюсь через мою термин. программу к прибору и получаю с СОМ порта следующее: ---/00016661<0 >6==;83<<49;:8 3><0;1>?4388>< 2:000000003; Это ответ прибора на запрос из программы (здесь данные о температуре, расходе, давлении, перепаде). Как эту последовательность преобразовать в читабельный формат. С уважением Александр. |