Перейти к содержанию
Fire Monkey от А до Я
  • 1

com-порт FireMonkey


lis

Вопрос

Здравствуйте

Собственно вопрос в названии: подскажите, кто знает, подходящие компоненты. Раньше пользовался AsyncPro, но в FireMonkey от него получаю ошибки вида

 

[bcc32 Error] Unit1.h(17): E2015 Ambiguity between 'Vcl::Forms::TForm' and 'Fmx::Forms::TForm'
  Full parser context
    Unit1.cpp(6): #include Unit1.h
    Unit1.h(16): class TForm1

 

 

Заранее спасибо!

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Поменяйте объявления в uses, компилятор вам же подсказывает - что на что надо заменить.

Но я что-то сомневаюсь, что самому компоненту нужны формы. Скорее всего, вы пытаетесь скомпилировать приложение, использующее компонент.

Изменено пользователем kami
Ссылка на комментарий
  • 0

Получается, менять надо в исходниках компонента vcl на fmx? По-моему, это как-то "по-вандальному" что ли.. Есть недюжие сомнения, что после моих манипуляций компонента заработает нормально. Да и если я так сделаю - то старые проекты, которые на vcl написаны, получается уже не смогу пересобрать на этом ПК.. Я так понимаю, AsyncPro в принципе заточен под vcl и перетащить его значит нехило переписать..

 

Скомпилировать я пытаюсь пустую форму, на которую кинул один единственный компонент ком-порта.

Изменено пользователем lis
Ссылка на комментарий
  • 0

Я так понимаю, AsyncPro в принципе заточен под vcl и перетащить его значит нехило переписать..

AsyncPro заточен на работу с COM-портом средствами API Windows. Неохота устанавливать этот компонент, но я уверен, что зависимостей от FMX.xxxx модулей у него нет, как и зависимостей от VCL.xxxxx. Максимум - используется Forms для Application.ProcessMessages и Controls для возможности размещения на форме. В остальном переписывание не должно потребоваться.

Раз вы умудрились положить компонент на FMX-форму, значит он уже скомпилирован и готов к использованию в FMX (поскольку Parent имеют разные типы), все остальное, скорее всего - ваши недочеты.

Ссылка на комментарий
  • 0

Я не умудрялся, располагая компонент на форме, он был сразу доступен :)

 

Зашел в заголовочные файлы, подключаемые к моему проекту при расположении компонента AsyncPro на форму. Увидел, что ему для работы нужны, как минимум

 
#include <Vcl.Controls.hpp> // Pascal unit
#include <Vcl.OleCtrls.hpp> // Pascal unit
#include <Vcl.Forms.hpp> // Pascal unit
#include <Vcl.Graphics.hpp> // Pascal unit
 
Если не сложно, опишите подробнее, в чем мои недочеты и как их можно исправить? Что, где, на что заменить?
 
ps AsyncPro установлен согласно мануалу (c++ builder xe3), в vcl все работает прекрасно. В fmx создаю новый проект, кидаю на него один компонент com-порта (добавляются два заголовочных файла #include "OoMisc.hpp" #include "AdPort.hpp") и, при запуске, начинаются  Ambiguity between 
Изменено пользователем lis
Ссылка на комментарий
  • 0

Что то мне подсказывает, что письмена с аббревиатурой Vcl, тут работать не будут, не тот фреймворк. Есть вещи, которые заточены исключительно под Vcl. И Ole объекты автоматизации, тоже исключительно прерогатива windows c Vcl. Хотя могу и ошибаться...

Ссылка на комментарий
  • 0

тогда может есть другой какой компонент для работы с com-портом в fmx?

Понятия не имею, никогда не работал с com портом. Если такая проблема, почему на Vcl не возвращаешься?

Ссылка на комментарий
  • 0

Потому, что проект уже написан на fmx. И переписывать все под vcl - последнее дело

Понятно. Ну Инет тебе в помощь. Может Ярослав поможет. Неплохой иностранный ресурс http://www.fmxexpress.com посмотри....

Ссылка на комментарий
  • 0

вполне можно без компонентов пользоваться просто WinApi

portNum='\\.\COM28';
CommHandle:= CreateFile(portNum,GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);

ссылка

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0

вполне можно без компонентов пользоваться просто WinApi

portNum='\\.\COM28';
CommHandle:= CreateFile(portNum,GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);

ссылка

Спасибо! На первый взгляд, по ссылке куда меньше текста=) Проще разобраться!

 

Я тоже в своем проекте пользуюсь COM портом для общения с контроллером. могу выложить, если интересно.

напрямую через WinAPI?

 

Да, очень интересно!

Ссылка на комментарий
  • 0

Авторство всецело не мое, только правки вносил, т.к. в разных версиях студии код вел себя по-разному. 

Прощу прощения за то, что выкладываю в неудобной форме, просто из моего проекта сейчас это будет уже достаточно проблематично вытащить.

 

Код для использования:

На форме лежат Мемо, кнопки открытия/закрытия, эдит для отправляемых текстов и кнопка отправить.
в паблике у формы добавляем объект
 GPort: TComPort;

// ******************************************************************************
// ПРОЦЕДУРЫ РАБОТЫ С COM ПОРТОМ

// открываем порт
procedure TFormChannels.OpenPort(PortNum: Byte);
begin
  GPort := TComPort.Create(PortNum, br9600);
  GPort.OnRead := FormChannels.OnRead;
  GFlagOpen := true;
  FormChannels.ButtonClosePort.Enabled := true;
end;

// закрываем порт
procedure TFormChannels.ClosePort;
begin
  GPort.Free;
end;

// отправляем в порт данные
procedure TFormChannels.WritePort(strWrite: string);
var
  arrBytes: array of Byte;
  i: Integer;
begin
  if GFlagOpen = False then // проверяем, открыт ли порт
    OpenPort(strtoint(edtPort.Text)); // если нет, то открываем

  SetLength(arrBytes, Length(strWrite));

  for i := Low(arrBytes) to High(arrBytes) do
    arrBytes[i] := Ord(strWrite[i + 1]);

  GPort.Write(arrBytes);
  arrBytes := nil;
end;

// читаем данные из порта
procedure TFormChannels.OnRead(Sender: TObject; ReadBytes: array of Byte);
var
  i: Integer;
begin
  memRead1.Lines.BeginUpdate;
  for i := Low(ReadBytes) to High(ReadBytes) do
  begin
    if i > Low(ReadBytes) then
      memRead1.Text := memRead1.Text; // + '.';
    memRead1.Text := memRead1.Text + char(ReadBytes[i]);

  end;
// подчищаем заполняющийся Мемо
  if memRead1.Lines.Count > 5 then
  begin
    // memRead1.Clear;
    memRead1.Lines.Delete(0);
    memRead1.Lines.Delete(1);
  end;

  memRead1.Lines.EndUpdate;
end;

procedure TFormChannels.ButtonClosePortClick(Sender: TObject);
begin
  ClosePort;
end;

// открываем порт кнопкой
procedure TFormChannels.ButtonOpenPortClick(Sender: TObject);
begin
  OpenPort(strtoint(edtPort.Text));
end;

// отправляем в порт данные  кнопкой
procedure TFormChannels.btnWriteClick(Sender: TObject);
begin
  WritePort(FormChannels.edtWrite.Text);
end;

// КОНЕЦ ПРОЦЕДУР РАБОТЫ С COM ПОРТОМ
// ******************************************************************************

ComPort.zip

Ссылка на комментарий
  • 0
18 часов назад, DrunyaRuma сказал:

Добрый день, а будет ли этот модуль работать под Android? Нет ли у вас библиотеки или компонента для Delphi для работы с ComPort под Android (FTDI, Prilific? etc.)

Для Prolific PL2303 есть платная библиотека Winsoft ComPort for Android

Ссылка на комментарий
  • 0

Да я видел ее, у них не только для Prolific, но и для других есть. Скачал, установил, судя по всему они тоже за основу брали Java библиотеки и даже открытые из GitHub. Если получится что-то отпишусь.

 

Изменено пользователем DrunyaRuma
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...