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

Поиск:

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


Эксперт
***


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

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



Цитата(Gres @  31.5.2009,  15:26 Найти цитируемый пост)
Посылаю "0", а на железяке получаю "48" , при посылке "1" получаю "49" и т.д.

Дались вам всем побайтовые посылки...

Посылай не символы, а байты.
Дело в том, что символ "0" ни разу <> байт 0.
Делай так:
Код

var
  byteToSend:byte;
begin
  byteToSend:=0; // или_что_там_нужно_отправить
  myComPort.Send(byteToSend, SizeOf(byte));

или, если уж работаешь с символами, то:
Код

var
  CharToSend:AnsiChar;
begin
  CharToSend:=Chr(0);
  myComPort.Send(CharToSend, SizeOf(AnsiChar));

  
PM MAIL WWW   Вверх
Gres
Дата 1.6.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

kami     
Дались вам всем побайтовые посылки...
Посылай не символы, а байты.
Дело в том, что символ "0" ни разу <> байт 0.

Спасибо Вам огромное за подсказку, в чем отличие символа от его кода я знаюsmile
В общем проблема была в компоненте ComPort Library, эта приблуда заточена специально для работы в режиме терминала(просто эмулирует нажатие клавиш), для отправки данных там всего две функции: Write и Writestr, в обоих функциях передаваемый параметр является типом PChar...
В общем его получилось использовать со вторым методом предложенным Вами, но это слишком длинная и бесполезная работа(конвертировать символы туда и обратно).
Пришлось "спрыгнуть с удобного кресла" под названием ComPort Library и вернуться к Win API, там с байтами все нормально работает...
PM MAIL   Вверх
kami
Дата 1.6.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Gres @  1.6.2009,  13:21 Найти цитируемый пост)
Write и Writestr, в обоих функциях передаваемый параметр является типом PChar...

Цитата(Gres @  1.6.2009,  13:21 Найти цитируемый пост)
Пришлось "спрыгнуть с удобного кресла" под названием ComPort Library

Вы просто его готовить не умеете. smile 

Хотя может и ошибаюсь - не пользовался этой библиотекой. Нужно смотреть на объявление функций Write и WriteStr.

Это сообщение отредактировал(а) kami - 1.6.2009, 21:57
PM MAIL WWW   Вверх
Gres
Дата 5.6.2009, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(kami @  1.6.2009,  18:10 Найти цитируемый пост)
Хотя может и ошибаюсь - не пользовался этой библиотекой. Нужно смотреть на объявление функций Write и WriteStr.


Прочитав Ваше сообщение решил проверить исходники этого компонента, хотя неблагодарное это дело перелапачивать горы исходного кода ради одной функции которую можно гораздо проще реализовать на Win API. 
Можно и свой компонент накидать, но для меня это разовая работа и пока в нем нет нужды, а скопировать кусок кода из своих же исходников при необходимости я всегда смогуsmile

Вот то, что я нашел в том компоненте:


Код

 { The main TComPort component is defined in this unit. }
unit CPort;
{$I CPort.inc}
{$R-}
{$Q-}

interface

uses
  Windows, Messages, Classes, SysUtils, IniFiles, Registry, CPortTypes;

type

...(дальнейший код)
function TCustomComPort.Write(const Buffer: TCPortBytes;
  Count: Integer): Integer;
begin
 if FOverlapped then begin
    result := _WriteAsyncWrapper(Buffer,Count); // Do a synchronous write using overlapped APIs.
 end else begin
   result := 0;
   if _SyncWrite(Buffer,Count) then
      result := Count;
 end;
end;



Далее кусок из другого паса объявленного в этом:

Код

unit CPortTypes;
(******************************************************
 * ComPort Library ver. 4.0                           *
 *   for Delphi  7, 2007, 2009                        *
 * written by Dejan Crnila, 1998 - 2002               *
 * maintained by Lars B. Dybdahl, 2003                *
 *  and Warren Postma, 2008                           *
 *                                                    *
 * Fixed up for Delphi 2009 by W.Postma.  Oct 2008    *
 * More like completely rewritten, actually.          *
 *****************************************************)

 { Data Type Declarations used in various CPort code units }

interface

uses   Windows, Messages, Classes, SysUtils, IniFiles, Registry;

type

// this is the type Warren changed most of the untyped-parameters used
// in CPort.pas and CPortCtl.pas to:
  TCPortBytes = PAnsiChar;

  // various types formerly in CPort.pas:
  TCPortChar = AnsiChar;
  TPort = string;



Как видно из всего этого, данный компонент не пригоден для моих целей, его конечно можно подправить, но не стоит тратить на это время если есть другой способ.

Все равно спасибо Вам большое за помощь, я ни когда не работал с СОМ портом, это первый опыт, да и задача не совсем стандартная или вернее совсем не стандартная, научить железяку(пик контролер, в который тоже ваяю код) общаться с большим братомsmile


M
THandle
Модератор: используйте подсветку кода!


PM MAIL   Вверх
kami
Дата 5.6.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Gres @  5.6.2009,  07:48 Найти цитируемый пост)
Как видно из всего этого, данный компонент не пригоден для моих целей

ошибочное мнение.
PM MAIL WWW   Вверх
Gres
Дата 5.6.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(kami @  5.6.2009,  13:18 Найти цитируемый пост)
ошибочное мнение.

Ошибочное в чем? Поясните пожалуйста.
Насколько я понял из исходников данная функция позволяет передавать только символ типа PAnsiChar или родственные ему.
Мне нужно передать один байт(десятичное число от 0 до 255) и принять такой же ответ.

Цитата(kami @  31.5.2009,  18:27 Найти цитируемый пост)
Дело в том, что символ "0" ни разу <> байт 0.

Эта функция не позволяет записать байт в порт, она передает значение(числовое значение или код) символа или я ошибаюсь?
Поясните в чем.

Модераторам: спасибо за поправку, впредь буду учитывать.


Это сообщение отредактировал(а) Gres - 5.6.2009, 14:43
PM MAIL   Вверх
kami
Дата 5.6.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Gres @  5.6.2009,  14:40 Найти цитируемый пост)
Эта функция не позволяет записать байт в порт

Позволяет.

Код

var
  b:byte;
begin
  b:=254; // или $FE
  myComPort.Write(@b, Length(byte));



PM MAIL WWW   Вверх
kami
Дата 5.6.2009, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ай-я...
не заметил const в описании Write...
тогда так:

Код

var
  b:PAnsiChar;// или TCPortBytes, что одно и то же...
begin
  b:=AllocMem(SizeOf(byte));
  b[1]:=#0;
  Send(b, SizeOf(byte));


Это сообщение отредактировал(а) kami - 5.6.2009, 23:38
PM MAIL WWW   Вверх
Gres
Дата 6.6.2009, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(kami @  5.6.2009,  23:36 Найти цитируемый пост)
не заметил const в описании Write...
тогда так:

Это практически тоже самое, что и во втором примере в верхнем посте на этой странице, как я и сказал оно работает нормально. Но для меня это лишнее преобразование, которое вызовет кучу перекодировки после приема...
Просто компонент видимо еще сыроват, там есть функции внутри которые не доступны пользователю, но были бы очень интересны. Например, что мешает константу заменить на переменную и вывести ее наружу для смены типа посылаемых данных одним кликом...
Изначально компонент использует вызовы все того же win api, просто как и все компоненты предназначен для более удобного использования и уменьшения рукописного труда разработчиков, тока заточен он изначально под терминальные (АТ) команды...

Это сообщение отредактировал(а) Gres - 6.6.2009, 07:14
PM MAIL   Вверх
Yump
Дата 21.7.2009, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите, плз.
Перешел на TComPort4Beta (Delphi2009) с CPortLib3.1.(Delphi2006)

при асинхронном чтении из компорта в версии 3.1 можно было использовать любой тип в качестве буфера и я использовал такую конструкцию:

Код

...
procedure TForm1.ComPort1RxFlag(Sender: TObject);
var
  ....
  Operation1: PAsync;
  hex_ar: array [1..5] of byte;
  ...
begin
  InitAsync(Operation1);
  try
    ComPort1.ReadAsync(hex_ar, 5, Operation1);
  ....


и дальше уже работаю с элементами массива...

в 4-ой версии в качестве буфера можно использовать только TCPortBytes (PAnsiChar) и что-то я туплю, как с этим работать:

Код

procedure TForm1.ComPort1RxFlag(Sender: TObject);
var
  Operation1: PCPortAsync;
  ???
begin
  CportInitAsync(Operation1);
  ...
  try
    ...
    ComPort1.ReadAsync(...,5,Operation1);


может кто-нибудь подсказать, что тут делать?
PM MAIL   Вверх
alex003
Дата 20.2.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



  Доброе время суток. Подскажите пожалуйста
 Надо получить архивы с прибора. Подключаюсь через мою термин. программу к прибору и получаю с СОМ порта  следующее:

 ---/00016661<0
 >6==;83<<49;:8
 3><0;1>?4388><
 2:000000003;


 Это  ответ прибора на запрос из программы (здесь данные о температуре, расходе, давлении, перепаде).
Как эту последовательность преобразовать в читабельный формат. 
С уважением Александр.

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.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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