![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| zi4rox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 6.4.2008 Репутация: нет Всего: нет |
Всем привет,
Прошу помочь разобраться. Работаю с COM-портом, при помощи компоненты ComPort Library version 3.10, всё здорово, всё работает. Вот только загвоздка вот в чем: От устройства я принимаю байты (вида: 0х01 0хBA 0xFF ... - вобщем что угодно но только не символы), а этот компонент, да и другие подобные читают из ком порта именно символы. Как мне преобразовать строковый символ что я принял в реально переданный числовой байт? (попробывал StrToInt и т.п - не очень помогает) Добавлено через 14 минут и 40 секунд Попробывал через Byte() - но работает не на все символы. Вернее весь диапазон от 0х00 до 0хFF так передать не удастся, только те байты код символа которых существует |
|||
|
||||
| zi4rox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 6.4.2008 Репутация: нет Всего: нет |
Сейчас проверил обратную процедуру - вывел через Chr() все символы от 0х00 до 0хFF
Все есть. Тогда получается всё глубже и запутаннее. Народ, кто из ком-порта читал, как боролись с этой проблемой. * Поставил при чтении сейчас:
Некоторые он нормально преобразует, а некоторые принятый байты - просто на просто срезает вообще и не отображает. Передается следующая последовательность: 0xFF 0x01 0x80 0x01 0x80 0x01 0x80 0x01 0x80 .... после преобразований получаю только: 255 1 1 1 1 1 .... [/code] |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 9 Всего: 58 |
Подойдет?
Добавлено через 4 минуты и 23 секунды Кстати тоже работает, и прямо с префиксом '0x'. Что не помогает? |
|||
|
||||
| zi4rox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 6.4.2008 Репутация: нет Всего: нет |
C HexToInt никогда проблем не было, там вот как происходит дело:
С ком-порта считывается символ в формате string. Так вот мне этот символ, что я считал необходимо преобразовать в число(десятиричное/шестнадцетиричное - без разницы.) Я опробывал конструкции по переводу символа в его числовой код [ф-ции Byte() , ord()], так вот - некоторые символы они переводят, а с некоторыми у них проблема и их попросту зарезает. Вот попробую со скриншотами: Вот как происходит прием и конвертация сейчас: ![]() а вот как должно на самом деле(программа Terminal 1.9b): ![]() Как видно - 2 байта почему то сливаются в один, либо происходит неправильная конвертация символ-байт. Вобщем мне нужно добиться эффекта, как на 2ом скриншоте |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 9 Всего: 58 |
Прием каких символом происходит? ASCII или какие? |
|||
|
||||
| zi4rox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 6.4.2008 Репутация: нет Всего: нет |
В Terminal - точно ASCII, а через компоненту не уверен. Написано что принимает строку и всё, в исходнике компоненты, тоже не нашел ничего путного.
Если есть разные варианты, для разных форматов символов - скажите пожалуйста все - буду пробывать методом перебора |
|||
|
||||
| zi4rox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 6.4.2008 Репутация: нет Всего: нет |
Нашел причину сам:
Всё работает на самом деле, и перекодировка идет нормально - ошибка вот в чем: Все эти компоненты для работы с ком портом: BCPort, Com Port Library - все они работают жутко медленно (если ставить задержку хотя бы в 1 милисекунду (а это ужасно долго) между отправляемыми данными - они не успевают различать принятые байты и лепят всё в одно) - вобщем в топку их. Пожалуйста посоветуйте максимально быстрый способ чтения/записи/работы с ком-портом? |
|||
|
||||
| kami |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Они читают не символы, а байты. Что используется в качестве хранилища для принятых байт - строки, буфер памяти, TStream Поэтому правильный код это:
при условии, что s - это AnsiString. Но я не вижу смысла доступа отдельно к каждому байту. Здесь нужно смотреть протокол обмена. Добавлено через 2 минуты и 18 секунд В условиях работы под Windows это более чем нормально. Принцип работы программы должен основываться на событиях этих компонентов OnRead. В этом событии считывать ВСЕ, что пришло из порта. И потом, в случае необходимости - разделять каждый принятый буфер на байты. Как - показал в предыдущем посте. |
||||
|
|||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
забыл добавить : Что используется в качестве хранилища для принятых байт - строки, буфер памяти, TStream - это личные трудности используемого компонента, и ничто не мешает перезагрузить их в любое другое хранилище. |
|||
|
||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: 5 Всего: 11 |
У меня тоже что то похожее...вот у меня есть программатор(почти готовый) написал прогу, можете проверить? с ком портом не работал...может автор выложит свой код, если можно
-------------------- ![]() |
|||
|
||||
| zi4rox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 6.4.2008 Репутация: нет Всего: нет |
2 kami Спасибо Вам огромное. Ваше объяснение натолкнуло на мысль. Сейчас уже в нужном направлении покопался - пока трудностей не вижу. Ещё раз спасибо Вам.
2Christoph Для своих тестов ком порта, я использовал один из примеров, что шел вместе с BComPort |
|||
|
||||
| dizJis |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 18.5.2009 Репутация: нет Всего: нет |
Ребят, хотите совет? Если хотите научиться работать с com-портом, то забейте на компоненты, юзайте WinAPI, меньше проблем потом у вас будет. Я по началу тоже компоненты юзал, но в итоге отказался от них. Ручками порт проинициализировать, настроить, как тебе надо и работать с ним проще и быстрее
|
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
dizJis, ты юзал компоненты, пользовался боле высоким уровнем абстракции, научиться было проше, потом пошел уровнем ниже, сложнее. А остальным предлагаешь сразу на WinAPI писать?
|
|||
|
||||
| dizJis |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 18.5.2009 Репутация: нет Всего: нет |
||||
|
||||
| Gres |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 31.5.2009 Репутация: нет Всего: нет |
Приветствую всех, похожая проблема с компонентом ComPort Library, тока версию последнюю поставил 4 бета.
Вывожу данные через СОМ порт на железяку(пик контроллер), все замечательно выводится, НО... компонент выводит данные в ASCII коде... Посылаю "0", а на железяке получаю "48" , при посылке "1" получаю "49" и т.д. Программированием СОМ порта не занимался, вроде не сложно все, но не получается. Подскажите пожалуйста в чем моя ошибка или этот компонент предназначен только для работы в терминале? Это сообщение отредактировал(а) Gres - 31.5.2009, 15:27 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |