Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Embedded Linux
Ошибки при работе с библиотекой libserialport
dolmatov
Добавлено 17.05.2024 12:51 Редактировалось 17.05.2024 13:06
0
Сообщение: 1
dolmatov
0

Пункты: 1652
Регистрация: 03.07.2016
Плата MangoPi/T113-s3. /buildroot. Пытаюсь работать с библиотекой libserialport, версия 1.0.1. Получаю список доступных портов средствами самой библиотеки. Среди них имется "/dev/ttyS5". Получаю указатель на него и пытаюсь открыть, указатель ненулевой, но операция sp_open(port) возвращает -2.

фрагмент кода
Код
error = sp_get_port_by_name_f(sp_name, &port);
if (error == SP_OK) {
error = sp_open_f(port, SP_MODE_READ);


sp_get_port_by_name_f и sp_open_f - мои уазатели на соответствующие функции при загрузке из динамической библиотеки.

Установил переменную окружения LIBSERIALPORT_DEBUG=1, запустил программу, получаю:

Код
sp: sp_get_port_by_name(/dev/ttyS5, 0x231ec) called.
sp: Building structure for port /dev/ttyS5.
sp: get_port_details returning SP_OK.
sp: sp_get_port_by_name returning SP_OK.
sp: sp_open(0xb5500600, 0x1) called.
sp: Opening port /dev/ttyS5.
sp: get_config(0xb5500600, 0xb663dcd0, 0xb663dcac) called.
sp: Getting configuration for port /dev/ttyS5.
sp: get_flow(9, 0xb663dcd0) called.
sp: Getting advanced flow control.
sp: sp_last_error_message() called.
sp: sp_last_error_message returning Inappropriate ioctl for device.
sp: get_flow returning SP_ERR_FAIL: Getting termiox failed: Inappropriate ioctl for device.
sp: sp_free_error_message(Inappropriate ioctl for device) called.
sp: sp_free_error_message returning.
sp: get_config returning SP_ERR_FAIL.
sp: sp_close(0xb5500600) called.
sp: Closing port /dev/ttyS5.
sp: sp_close returning SP_OK.
sp: sp_open returning SP_ERR_FAIL.


Помогите выясниь причину проблемы...
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 17.05.2024 15:53 Сообщение: 2
sasamy
4.70

Пункты: 78553
Регистрация: 14.08.2009
Цитата

Плата MangoPi/T113-s3. /buildroot. Пытаюсь работать с библиотекой libserialport, версия 1.0.1.


что за библиотека ? то что в буилдруте - с версией 0.1.1

https://github.com/sigrokproject/libserialport/tags

Цитата

sp_get_port_by_name_f и sp_open_f - мои уазатели на соответствующие функции при загрузке из динамической библиотеки.


этот финт я вообще не понял - возьмите пример да и соберите, какой смысл с самого начала грабли заботливо раскладывать..
Спуститься к концу Подняться к началу
Персональная информация
dolmatov
Добавлено 17.05.2024 21:49 Редактировалось 17.05.2024 23:19 Сообщение: 3
dolmatov
0

Пункты: 1652
Регистрация: 03.07.2016
Цитата

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


Да, Вы совершенно правы, разумеется.. Видимо я сначала должен был спросить разобраться как грамотно использовать динамическую библиотеку. Сейчас я в ран-тайм программно открываю библиотеку, считываю из нее указатель на функцию, и затем этот указатель использую в качестве самой функции. Подход очень громоздкий, и видимо, существет альтернативный метод, динамическая линковка, с которым я незнаком пока что. Но мой метод худо бедно оправдал себя при работе с библиотекой libgpiod, Там у меня все получилось как нужно, и я продолжил в том же духе. Этот метод я почерпнул ЗДЕСЬ

Что касается версии библиотеки, то ее мне выдала сама библиотека, посредством ее функции gpiod_version_string(). (у меня, соответственно, указатель на нее gpiod_version_string_f())
И как я только что разглядел, я допустил ошибку в выводе результата этой функции на печать. Приношу свои извинения.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 19.05.2024 00:42 Редактировалось 19.05.2024 00:46 Сообщение: 4
sasamy
4.70

Пункты: 78553
Регистрация: 14.08.2009
Цитата

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


если собирать корневую в buildroot а приложение собирать отдельно и потом запускать в этой корневой можно сделать простейший Makefile

Цитата

BRDIR ?= /home/user/buildroot-2022.08.3-sk-t113
CC = $(BRDIR)/output/host/bin/arm-none-linux-gnueabihf-gcc
SYSROOT = $(BRDIR)/output/staging
LIBS = -lserialport
SRC = send_receive.c
BIN = send_receive

all:
$(CC) $(SRC) -o $(BIN) -O2 -Wall \
-I$(SYSROOT)/usr/include \
-L$(SYSROOT)/usr/lib \
--sysroot=$(SYSROOT) $(LIBS)

clean:
rm $(BIN)


В нем прописан пример
https://sigrok.org/api/libserialport/unstable/a00008.html

его надо положить в одной директории с этим Makefile

BRDIR - путь к buildroot в вашей системе
CC - название кросскомпилятора в вашей сборке buildroot

чтобы собрать достаточно выполнить просто

make

PS форум удалил отступы, вместо [TAB] должна быть табуляция в файле

Цитата

all:
[TAB]$(CC) $(SRC) -o $(BIN) -O2 -Wall \
[TAB]-I$(SYSROOT)/usr/include \
[TAB]-L$(SYSROOT)/usr/lib \
[TAB]--sysroot=$(SYSROOT) $(LIBS)

clean:
[TAB]rm $(BIN)
Спуститься к концу Подняться к началу
Персональная информация
dolmatov
Добавлено 20.05.2024 13:00 Редактировалось 20.05.2024 15:12 Сообщение: 5
dolmatov
0

Пункты: 1652
Регистрация: 03.07.2016
Цитата

all:
[TAB]$(CC) $(SRC) -o $(BIN) -O2 -Wall \
[TAB]-I$(SYSROOT)/usr/include \
[TAB]-L$(SYSROOT)/usr/lib \
[TAB]--sysroot=$(SYSROOT) $(LIBS)

clean:
[TAB]rm $(BIN)

Уважаемый sasamy, крайне признателен Вам за помощь в правильной работе с динамическими библиотеками. Однако изначальная проблема была(и все еще имеет место) все таки в чем то другом. Запустил пример по Вашей ссылке и получил по-сути тот же самый результат..

Код
Looking for port /dev/ttyS5.
Opening port.
Error: Failed: Inappropriate ioctl for device
Aborted


Такой же результат получаю при попытке открыть порты ttyUSB0 или ttyUSB1 - (конвертер FT2232), их наличие в сиситеме тоже показывает фунукция sp_list_ports(struct sp_port **ports) этой же самой библиотеки..

между тем выхлоп команды stty:
Код
stty -F /dev/ttyS5
speed 9600 baud; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-brkint -imaxbel


PS: Похоже вот в чем дело ... https://sigrok.org/bugzilla/show_bug.cgi?id=1687
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 20.05.2024 17:56 Редактировалось 20.05.2024 18:01 Сообщение: 6
sasamy
4.70

Пункты: 78553
Регистрация: 14.08.2009
Цитата

PS: Похоже вот в чем дело


добавьте патч в buildroot, находясь в корне buildroot

wget https://raw.githubusercontent.com/sielenk/gentoo-ebuild-repository/main/dev-libs/libserialport/files/libserialport-termiox.patch -P ./package/libserialport/

и пересоберите libserialport

rm -rf ./output/build/libserialport*
make
Спуститься к концу Подняться к началу
Персональная информация
dolmatov
Добавлено 28.05.2024 07:05 Редактировалось 28.05.2024 08:10 Сообщение: 7
dolmatov
0

Пункты: 1652
Регистрация: 03.07.2016
Еще одна странность... Использовал эту библиотеку для работы с BLE модулем, не получалось получить ответ на АТ команды модуля, хотя при работе от терминала с USB/Com на РС все ОК. Сличил осциллограммы от USB/Com на РС и от последовательного порта платыю Обнаружил что при заданном BaudRate 230400, фактическая скорость прередачи с платы составляет примерно 0.93 от скорости с USB/Com ...

P.S. Ответа не требуется, освежил в памяти как задается BaudRate у процессора T113, вижу, что максимальное значение baudrate из стандартного ряда, с приемлемой точностью можно выбрать только 115200 .. При частоте кварца 24 МГц.
Спуститься к концу Подняться к началу
Персональная информация
dolmatov
Добавлено 20.06.2024 22:55 Сообщение: 8
dolmatov
0

Пункты: 1652
Регистрация: 03.07.2016
Цитата
максимальное значение baudrate из стандартного ряда, с приемлемой точностью можно выбрать только 115200 .. При частоте кварца 24 МГц.


Можно ли решить эту проблему(получить BR > 115200) используя, например, кварцевый резонатор частотой 22.118.400, не получив в качестве побочного эффекта каких либо критических последствий ?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 21.06.2024 02:01 Редактировалось 21.06.2024 02:10 Сообщение: 9
sasamy
4.70

Пункты: 78553
Регистрация: 14.08.2009
Цитата

Можно ли решить эту проблему(получить BR > 115200) используя, например, кварцевый резонатор частотой 22.118.400, не получив в качестве побочного эффекта каких либо критических последствий ?


это слишком радикально - можно источник тактирования у apb1 поменять вместо hosc 24М.

Тут есть аналогичная тема но для другого процессора

http://starterkit.ru/html//index.php?name=forum&op=view&id=31516&last

я не знаю какое у вас ядро потому что плата не местная, пример на местной плате с её ядром

1) штатный лог
Цитата

dmesg | grep base_baud
[ 0.904510] 2500800.serial: ttyS2 at MMIO 0x2500800 (irq = 236, base_baud = 1500000) is a AW_16550A
[ 0.914871] 2500c00.serial: ttyS3 at MMIO 0x2500c00 (irq = 237, base_baud = 1500000) is a AW_16550A
[ 0.943470] 2501400.serial: ttyS5 at MMIO 0x2501400 (irq = 238, base_baud = 1500000) is a AW_16550A


2) поменял источник apb1

&ccu {
assigned-clocks = <&ccu CLK_APB1>;
assigned-clock-parents = <&ccu CLK_PSI_AHB>;
};

Стало
Цитата

# dmesg | grep base_baud
[ 0.639509] 2500800.serial: ttyS2 at MMIO 0x2500800 (irq = 236, base_baud = 12500000) is a AW_16550A
[ 0.641887] 2500c00.serial: ttyS3 at MMIO 0x2500c00 (irq = 237, base_baud = 12500000) is a AW_16550A
[ 0.663232] 2501400.serial: ttyS5 at MMIO 0x2501400 (irq = 238, base_baud = 12500000) is a AW_16550A


есть еще вариант

&ccu {
assigned-clocks = <&ccu CLK_APB1>;
assigned-clock-parents = <&ccu CLK_PLL_PERIPH0>;

};

Ну и кроме выбора источника, клок apb1 можно его делителями скорректировать

3.3.6.36 0x0524 APB1 Clock Register (Default Value: 0x0000_0000)

APB1_CLK = Clock Source/M/N.

можно частоту в DT указать
Спуститься к концу Подняться к началу
Персональная информация
dolmatov
Добавлено 21.06.2024 09:22 Редактировалось 24.06.2024 22:15 Сообщение: 10
dolmatov
0

Пункты: 1652
Регистрация: 03.07.2016
Спасибо, разобрался. Все получилось ...
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux