Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Com порт. Перекодировать принятый байт. 
:(
    Опции темы
zi4rox
Дата 12.5.2009, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.4.2008

Репутация: нет
Всего: нет



Всем привет, 

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

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

Добавлено через 14 минут и 40 секунд
Попробывал через Byte() - но работает не на все символы. Вернее весь диапазон от 0х00 до 0хFF так передать не удастся, только те байты код символа которых существует
PM MAIL   Вверх
zi4rox
Дата 12.5.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.4.2008

Репутация: нет
Всего: нет



Сейчас проверил обратную процедуру - вывел через Chr() все символы от 0х00 до 0хFF
Все есть. Тогда получается всё глубже и запутаннее.

Народ, кто из ком-порта читал, как боролись с этой проблемой. 
* Поставил при чтении сейчас:
Код

Str: string;
i: char;
byte: integer;

i:=Str[1];
byte:=ord(i);


Некоторые он нормально преобразует, а некоторые принятый байты - просто на просто срезает вообще и не отображает.

Передается следующая последовательность: 0xFF 0x01 0x80 0x01 0x80 0x01 0x80 0x01 0x80 ....

после преобразований получаю только: 255 1 1 1 1 1 ....

[/code]
PM MAIL   Вверх
Keeper89
Дата 12.5.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Подойдет?
Код

function HexToInt(const hexStr: String): Integer;
const
  PRFX = '0x';
  NEW_PRFX = '$';
begin
  // Преобразуем шестн. число 0x... в дес.

  Result := StrToInt(StringReplace(hexStr, PRFX, NEW_PRFX, [rfReplaceAll]));
end;


Добавлено через 4 минуты и 23 секунды
Цитата(zi4rox @  12.5.2009,  19:25 Найти цитируемый пост)
(попробывал StrToInt и т.п - не очень помогает)

Кстати тоже работает, и прямо с  префиксом '0x'. Что не помогает?


--------------------
PM MAIL WWW   Вверх
zi4rox
Дата 12.5.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.4.2008

Репутация: нет
Всего: нет



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

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

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

Вот попробую со скриншотами:

Вот как происходит прием и конвертация сейчас:
user posted image

а вот как должно на самом деле(программа Terminal 1.9b): 
user posted image

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

Вобщем мне нужно добиться эффекта, как на 2ом скриншоте
PM MAIL   Вверх
Keeper89
Дата 12.5.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Цитата(zi4rox @  12.5.2009,  20:35 Найти цитируемый пост)
Вот как происходит прием и конвертация сейчас:

Прием каких символом происходит? ASCII или какие?


--------------------
PM MAIL WWW   Вверх
zi4rox
Дата 12.5.2009, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.4.2008

Репутация: нет
Всего: нет



В Terminal - точно ASCII, а через компоненту не уверен. Написано что принимает строку и всё, в исходнике компоненты, тоже не нашел ничего путного. 

Если есть разные варианты, для разных форматов символов - скажите пожалуйста все - буду пробывать методом перебора
PM MAIL   Вверх
zi4rox
Дата 12.5.2009, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.4.2008

Репутация: нет
Всего: нет



Нашел причину сам: 

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

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

Пожалуйста посоветуйте максимально быстрый способ чтения/записи/работы с ком-портом?
PM MAIL   Вверх
kami
Дата 12.5.2009, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(zi4rox @  12.5.2009,  19:25 Найти цитируемый пост)
этот компонент, да и другие подобные читают из ком порта именно символы. 

Они читают не символы, а байты.
Что используется в качестве хранилища для принятых байт - строки, буфер памяти, TStream

Поэтому правильный код это:
Код

b:byte;

b:=byte(s[i]);


при условии, что s - это AnsiString.
Но я не вижу смысла доступа отдельно к каждому байту.
Здесь нужно смотреть протокол обмена.

Добавлено через 2 минуты и 18 секунд
Цитата(zi4rox @  12.5.2009,  22:03 Найти цитируемый пост)
они не успевают различать принятые байты и лепят всё в одно

В условиях работы под Windows это более чем нормально.

Принцип работы программы должен основываться на событиях этих компонентов OnRead.
В этом событии считывать ВСЕ, что пришло из порта.

И потом, в случае необходимости - разделять каждый принятый буфер на байты.
Как - показал в предыдущем посте.
PM MAIL WWW   Вверх
kami
Дата 12.5.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(kami @  12.5.2009,  22:03 Найти цитируемый пост)
Что используется в качестве хранилища для принятых байт - строки, буфер памяти, TStream

забыл добавить :
Что используется в качестве хранилища для принятых байт - строки, буфер памяти, TStream - это личные трудности используемого компонента, и ничто не мешает перезагрузить их в любое другое хранилище.
PM MAIL WWW   Вверх
Christoph
Дата 12.5.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



У меня тоже что то похожее...вот у меня есть программатор(почти готовый) написал прогу, можете проверить? с ком портом не работал...может автор выложит свой код, если можно

Код

unit Comport;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, BCPort, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    BComPort1: TBComPort;
    LabeledEdit1: TLabeledEdit;
    Memo1: TMemo;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  BComPort1.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  BComPort1.Close;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  Operation1: PAsync;
  Str: String;
begin
  Str := 'Hello';
  InitAsync(Operation1);
  try
    BComPort1.WriteAsync(Str[1], Length(Str), Operation1);
    BComPort1.WaitForAsync(Operation1);
  finally
    DoneAsync(Operation1);
  end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  Buff: array[1..100] of byte;
begin
  BComPort1.Read(Buff,SizeOf(Buff));
end;

end.



--------------------
user posted image
PM MAIL ICQ   Вверх
zi4rox
Дата 12.5.2009, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.4.2008

Репутация: нет
Всего: нет



2 kami Спасибо Вам огромное. Ваше объяснение натолкнуло на мысль. Сейчас уже в нужном направлении покопался - пока трудностей не вижу. Ещё раз спасибо Вам.

2Christoph Для своих тестов ком порта, я использовал один из примеров, что шел вместе с BComPort
PM MAIL   Вверх
dizJis
Дата 18.5.2009, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.5.2009

Репутация: нет
Всего: нет



Ребят, хотите совет? Если хотите научиться работать с com-портом, то забейте на компоненты, юзайте WinAPI, меньше проблем потом у вас будет. Я по началу тоже компоненты юзал, но в итоге отказался от них. Ручками порт проинициализировать, настроить, как тебе надо и работать с ним проще и быстрее
PM MAIL   Вверх
NewDima
Дата 18.5.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



dizJis, ты юзал компоненты, пользовался боле высоким уровнем абстракции, научиться было проше, потом пошел уровнем ниже, сложнее. А остальным предлагаешь сразу на WinAPI писать?
PM ICQ   Вверх
dizJis
Дата 19.5.2009, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.5.2009

Репутация: нет
Всего: нет



Цитата(NewDima @  18.5.2009,  12:09 Найти цитируемый пост)
ользовался боле высоким уровнем абстракции, научиться было проше, потом пошел уровнем ниже, сложне

как раз таки наоборотsmile В начале я юзал винапи, потом поюзал компоненты, а вот после них понял, что винапи лучшеsmile
PM MAIL   Вверх
Gres
Дата 31.5.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 31.5.2009

Репутация: нет
Всего: нет



Приветствую всех, похожая проблема с компонентом ComPort Library, тока версию последнюю поставил 4 бета.
Вывожу данные через СОМ порт на железяку(пик контроллер), все замечательно выводится, НО... компонент выводит данные в ASCII коде...
Посылаю "0", а на железяке получаю "48" , при посылке "1" получаю "49" и т.д.
Программированием СОМ порта не занимался, вроде не сложно все, но не получается.
Подскажите пожалуйста в чем моя ошибка или этот компонент предназначен только для работы в терминале? 

Это сообщение отредактировал(а) Gres - 31.5.2009, 15:27
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0664 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.