Страница 1 из 1

Com порт. Перекодировать принятый байт

Добавлено: 12 май 2009, 22:03
zi4rox
Всем привет,

Прошу помочь разобраться. Работаю с COM-портом, при помощи компоненты ComPort Library version 3.10, всё здорово, всё работает. Вот только загвоздка вот в чем:

От устройства я принимаю байты (вида: 0х01 0хBA 0xFF ... - вобщем что угодно но только не символы), а этот компонент, да и другие подобные читают из ком порта именно символы. Как мне преобразовать строковый символ что я принял в реально переданный числовой байт?

C HexToInt никогда проблем не было, там вот как происходит дело:

С ком-порта считывается символ в формате string. Так вот мне этот символ, что я считал необходимо преобразовать в число(десятиричное/шестнадцетиричное - без разницы.)

Я опробывал конструкции по переводу символа в его числовой код [ф-ции Byte() , ord()], так вот - некоторые символы они переводят, а с некоторыми у них проблема и их попросту зарезает.

Вот попробую со скриншотами:
Вот как происходит прием и конвертация сейчас:
Изображение

а вот как должно на самом деле(программа Terminal 1.9b):
Изображение

Как видно - 2 байта почему то сливаются в один, либо происходит неправильная конвертация символ-байт.

Вобщем мне нужно добиться эффекта, как на 2ом скриншоте

* Прошу прощения, но на данном форуме картинки в виде ссылок прикрепляются =(
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Нашел причину сам:

Всё работает на самом деле, и перекодировка идет нормально - ошибка вот в чем:

Все эти компоненты для работы с ком портом: BCPort, Com Port Library - все они работают жутко медленно (если ставить задержку хотя бы в 1 милисекунду (а это ужасно долго) между отправляемыми данными - они не успевают различать принятые байты и лепят всё в одно) - вобщем в топку их.

Пожалуйста посоветуйте максимально быстрый способ чтения/записи/работы с ком-портом?

Re: Com порт. Перекодировать принятый байт

Добавлено: 19 май 2009, 10:35
ukolov_al
Читаем и пишем COM-порт, используя штатные средства Windows:
CreateFile, ReadFile, WriteFile и CloseHandle. Проще в синхронном режиме, но можно и асинхронно (возни только больше). Еще для настройки порта, управления портом и проверки его состояния понадобятся:
SetCommState, SetCommTimeouts, SetupComm, SetCommMask, EscapeCommFunction, PurgeComm, GetCommState, ModemStatus, WaitCommEvent и пр.

Типа:

var
HPort: THandle;
Overlap: TOverlapped;
...
Hport:= CreateFile(
'\\.\COM1', // File Name
GENERIC_READ+GENERIC_WRITE, // Access Type
0, // Share Mode - exclusive
Nil, // Security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
0, // flag attributes = 0 - not overlapped I/O
0 // hTemplate must be NULL for comm devices
);
...
Overlap.Offset:= 0;
Overlap.OffsetHigh:= 0;
Overlap.hEvent:= 0;
...
ReadFile(HPort, Value, ByteCnt, i, @Overlap);
...
WriteFile(HPotrt, Value, ByteCnt, i, @Overlap);
...
CloseHandle(HPort);