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

Serial port


Vanka

Вопрос

Добрый день!

Необходимо реализовать под Android прием и передачу данных с последовательного порта. Самостоятельно смог найти лишь платный сторонний компонент http://www.winsoft.sk/acomport.htm.

Есть ли возможность решить задачу без компонентов?
Или может есть свободные компоненты с открытым кодом?

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

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

  • 0

Как-то заглохла тема

В связи с необходимостью отладки приема данных через USB <> COM очень хочется чтобы одновременно android планшет был подключен к компьютеру (для отладки в среде) и USB устройство к планшету. Купил USB-хаб, думал все получится, но нет, не работает. Может кто знает как такое подключение реализовать?

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

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

Да я бы с удовольствием, но пока не продвигается. Т.е. продвигается, но, увы, не в RadStudio.

После попыток прикрутить к проекту прием данных с последовательного порта и отображение потокового видео и столкнувшись с таким кол-вом проблем я пришел к выводу, что написать приложение с нужным мне функционалом в RadStudio весьма геморно. И гарантий стабильности и производительности тоже нет.

А на java те же задачи решаются просто. Поэтому пошел изучать Java и Android Studio.

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

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

Было дело как-то на windows, использовал сторонний пакет с wms картами с hasp ключом разработчика, глюками и нежеланием жить полной жизнью с потоками. 

Функционал: в числе прочего, отрисовка слоев карт со всех основных wms серверов.

 

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

 

Не мудрствуя лукаво, собрал пакет в консольное приложение, анонимный канал (Pipe), замена стандартного ввода\вывода и класс для простоты общения. 

Таким образом, в основном приложении есть класс, который запускает дочерний процесс с вышеуказанной библиотекой и через свой интерфейс запрашивает у него слои в виде массивов. 

Работает стабильно, внутреннее спокойствие стало ближе.

 

Полагаю, что-то подобное, некий провайдер для работы с usb, со спецификой системы конечно, можно сделать на AndroidStudio и XCode.

Через пжоу конечно, но если очень хочется и крупный проект на RadStudio...

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

Несколько часов не мог понять, при чем тут Java2OP и Classes.dex, пока не прокачал обе темы и не нашел статью «Using a Custom Set of Java Libraries In Your RAD Studio Android Apps».

За то теперь мой класс BootReceiver (extends BroadcastReceiver) добавляется через Project Manager, и проект компилируется и запускается. Правда при загрузке системы ресивер не отрабатывает — днем разберемся.

1. Написал JAVA класс.

2. Скомпилировал в JAR.

3. Сделал обертку при помощи Java2OP.

4. Подключил JAR в Project Manager.

5. Добавил к проекту обертку.

6. Подшаманил AndroidManifest.template.xml (если это нужно в задаче).

7. Пожалуйста → компилируй, собирай.

Это реальный прогресс, по сравнению с ручным формированием DEX (ни Clean не сделать, ни Build Conf поменять). Только не знаю, с какой версии появилась такая возможность.

Изменено пользователем Pax Beach
Ссылка на комментарий
  • 0
  • Администраторы
9 часов назад, Pax Beach сказал:

Только не знаю, с какой версии появилась такая возможность.

Появилась с версии XE7.

Ссылка на комментарий
  • 0
12 часа назад, Pax Beach сказал:

Правда при загрузке системы ресивер не отрабатывает — днем разберемся.

Кто-нибудь знал, чтобы сервис автоматически запускался по событию BOOT_COMPLETED, нужно, чтобы сервис был Remote Service?

В этом случае AndroidManifest.xml будет содержать строку <service android:exported="true" android:name="com.embarcadero.services.BootService" />, а это в свою очередь хорошо отразится на успешном запуске вашего сервиса после перезагрузки устройства.

Это была хорошая новость.

Плохая заключается в том, что если сервис уже написан, и вам надо включить его в автозагрузку, придется переписать сервис заново (перенести все написанное из обычного в Remote Service).

Пора делать отдельный топик. Всем благ!

 

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

Приветствую всех. Тоже возникла необходимость работать с устройством посредством чипа FTDI из-под андроида. На гитхабе есть код. Однако он на JAVA. Подскажите, возможно ли этот код подключить к своему проекту на FMX?

Ссылка на комментарий
  • 0
В 08.10.2018 в 08:36, GASCHE сказал:

А сначала топика почитать, нет? Там же есть как  создавать обертки через Java2OP.

Прошу прощения за поспешный вопрос.

После прочтения этого топика и нескольких других, у меня возник вопрос: нельзя ли осуществить работу с последовательным портом не используя код на Java? Так как C++Builder предоставляет несколько стандартных модулей для работы с Android API, стал пытаться. За основу взял известный код на гитхабе.

Решил начать с поиска всех подключенных к USB устройств. В файле UsbSerialProber.java из вышеуказанной библиотеки, код которого выполняет поиск устройств, подключены 2 модуля:

import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;

В C++Builder подключил файл Androidapi.Hardware.hpp, так как он более всего подходит по названию к подключаемым модулям в Java коде. И, собственно, на этом все. В этом файле  я не нашел никакого упоминания о USB и, тем более, о UsbDevice и UsbManager. Видимо, надо подключать файлы Android.Hardware.Usb.UsbDevice и Android.Hardware.Usb.UsbManager, но их нет в C++Builder. Наверное, это означает, что необходимо, все таки, писать код на Java и создавать обертку...

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

Прошу прощения за поспешный вопрос.

После прочтения этого топика и нескольких других, у меня возник вопрос: нельзя ли осуществить работу с последовательным портом не используя код на Java? Так как C++Builder предоставляет несколько стандартных модулей для работы с Android API, стал пытаться. За основу взял известный код на гитхабе.

Решил начать с поиска всех подключенных к USB устройств. В файле UsbSerialProber.java из вышеуказанной библиотеки, код которого выполняет поиск устройств, подключены 2 модуля:


import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;

В C++Builder подключил файл Androidapi.Hardware.hpp, так как он более всего подходит по названию к подключаемым модулям в Java коде. И, собственно, на этом все. В этом файле  я не нашел никакого упоминания о USB и, тем более, о UsbDevice и UsbManager. Видимо, надо подключать файлы Android.Hardware.Usb.UsbDevice и Android.Hardware.Usb.UsbManager, но их нет в C++Builder. Наверное, это означает, что необходимо, все таки, писать код на Java и создавать обертку...

Можно создать обертку для java-классов, которые есть в исходниках Android с помощью Java2OP, или же руками, посмотрев как раз исходники.

Исходники %sdk_path%\sources\android-nn\android\hardware\usb

android-nn - версия API

И уже эти файлы подключать.

Либо взять готовые от FMXExpress

Изменено пользователем mazayhin
Ссылка на комментарий
  • 0
В 07.11.2018 в 14:14, d7d1cd сказал:

Прошу прощения за поспешный вопрос.

После прочтения этого топика и нескольких других, у меня возник вопрос: нельзя ли осуществить работу с последовательным портом не используя код на Java? Так как C++Builder предоставляет несколько стандартных модулей для работы с Android API, стал пытаться. За основу взял известный код на гитхабе.

Решил начать с поиска всех подключенных к USB устройств. В файле UsbSerialProber.java из вышеуказанной библиотеки, код которого выполняет поиск устройств, подключены 2 модуля:


import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;

В C++Builder подключил файл Androidapi.Hardware.hpp, так как он более всего подходит по названию к подключаемым модулям в Java коде. И, собственно, на этом все. В этом файле  я не нашел никакого упоминания о USB и, тем более, о UsbDevice и UsbManager. Видимо, надо подключать файлы Android.Hardware.Usb.UsbDevice и Android.Hardware.Usb.UsbManager, но их нет в C++Builder. Наверное, это означает, что необходимо, все таки, писать код на Java и создавать обертку...

Но все же, думаю лучше, скомпилировать JAR и к нему уже делать обертку. Т.к. в противном случае, придется с собой очень много чего тащить в проект (java.*, javax.* и прочие, смотрите, сколько там зависимостей), что можно сказать, равнозначно почти собирать в студии половину android-api

Ссылка на комментарий
  • 0
В 08.10.2020 в 11:10, d7d1cd сказал:

Получилось использовать COM порт в Android?

Да

https://ru.stackoverflow.com/questions/1187519/Работа-с-библиотекой-com-github-mik3yusb-serial-for-android-из-delphi?noredirect=1#comment2069760_1187519

 

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

JavaWrapper.zip

uses
  FMX.Dialogs,
  System.DateUtils,
  System.SysUtils,
  System.Types,
  Androidapi.JNIBridge,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Os,
  Androidapi.Helpers,
  Androidapi.JNI.App,
  Androidapi.Jni,
  JavaInterfaces,

var
    FUSBManager : JUsbManager;
    FProber     : JUsbSerialProber;
    FDriver     : JUsbSerialDriver;
    FConnection : JUsbDeviceConnection;
    FPort       : JUsbSerialPort;
    FList       : JList;
	LastErrMsg  : string;

function USBPortOpen: Boolean;
begin
  try
    FUSBManager := TJUsbManager.Wrap(TAndroidHelper.Activity.getSystemService(TJContext.JavaClass.USB_SERVICE));
    FProber := TJUsbSerialProber.JavaClass.getDefaultProber;
    FList := FProber.findAllDrivers(FUSBManager);

    if FList.isEmpty then
      Exit(False);

    FDriver := TJUsbSerialDriver.Wrap(FList.get(0));
    FConnection := FUSBManager.openDevice(FDriver.getDevice);

    if not Assigned(FConnection) then
    begin
      Exit(False);
    end;

    FPort := TJUsbSerialPort.Wrap(FDriver.getPorts.get(0));
    FPort.open(FConnection);
    FPort.setParameters(ChannelSettings.Speed, ChannelSettings.Bits, ChannelSettings.StopBits, ChannelSettings.Parity);
    Exit(True);
  except
    on E: Exception do
    begin
      LastErrMsg := E.ClassName + ' поднята ошибка, с сообщением : ' + E.Message;
    end;
  end;

  Result := False;
end;

function UsbWrite(): Boolean;
var
	arr: TJavaArray<Byte>;	
    Count: Intger;  
begin
      arr := TJavaArray<System.Byte>.Create(Length(BufIn));
      Count := FPort.Write(arr, TimeOut);
      Result := (Count > 0)
end;

function UsbRead(): Boolean;
var
	arr: TJavaArray<Byte>;
    Count: Intger; 
begin
      arr := TJavaArray<System.Byte>.Create(Length(BufIn));
      Count := FPort.read(arr, TimeOut);
      Result := (Count > 0)
end;

 

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

@destroyer86, спасибо. Сейчас возникла необходимость в этом. Но мне надо завести это в C++Builder. Не поможете?

Jar файл я в свой проект добавил, обертку скомпилировал и получил плюсовой hpp хедер, который приинклудил в коде. Как мне получить список доступных COM портов?

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

Добавлю сюда свой вопрос. Собрал jar библиотеку из последней версии  usb-serial-for-android сделал обертку, добавляю в проект и при компиляции получаю такую ошибку:

"[Exec Error] EXEC(1): com.android.dx.cf.code.SimException: ERROR in сom.hoho.android.usbserial.driver.ProlificSerialDriver$ProlificSerialPort.getStatus:()I: invalid opcode ba - invokedynamic requires --min-sdk-version >= 26 (currently 13)" 

Пишут, для Gradle можно указать
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
 

Но как победить ее в Rad Studio 10.4.2 ? 

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

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

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

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

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

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

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

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

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

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

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