BG Development


Страници: (3) 1 [2] 3   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Достъп до серийните портове под linux
thrawn
Публикувано на: 29-10-2025, 16:59
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3864
Регистриран на: 17.01.17



Да, ще помогне (ако проблемът е в библиотеката).

Ако това което имаш работи коректно и има натив библиотеката я погледни с ldd дали ползва libudev, както твърди бота че трябва да е.
PMEmail Poster
Top
relax4o
Публикувано на: 29-10-2025, 20:20
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2849
Регистриран на: 04.04.07



Изглежда .NET-аджиите никога не са ползвали libudev. Всичко е четене на файлове и директории.

Ето това е, което прави https://github.com/dotnet/runtime/blob/v9.0...Unix.cs#L32-L91

Като цяло този метод не е мърдал въобще.

Аз също нямам натив библиотеката, даже се учудвам, че на някоя от системите, които си тествал я има.

Иначе с помощта на чатгпт ми сътвори това, което използва libudev API-а. Нямам никакъв опит с такъв тип програмиране на C#, така че адекватно мнение не мога да дам, но изглежда да работи. Само го накарах да филтрира само сериал портове.

CODE

using System.Runtime.InteropServices;

class Program
{
   private const string LibUdev = "libudev.so.1"; // Or "libudev.so" depending on system

   [DllImport(LibUdev)]
   private static extern IntPtr udev_new();

   [DllImport(LibUdev)]
   private static extern IntPtr udev_unref(IntPtr udev);

   [DllImport(LibUdev)]
   private static extern IntPtr udev_enumerate_new(IntPtr udev);

   [DllImport(LibUdev, CharSet = CharSet.Unicode)]
   private static extern int udev_enumerate_add_match_subsystem(IntPtr enumerate, string subsystem);

   [DllImport(LibUdev)]
   private static extern int udev_enumerate_scan_devices(IntPtr enumerate);

   [DllImport(LibUdev)]
   private static extern IntPtr udev_enumerate_get_list_entry(IntPtr enumerate);

   [DllImport(LibUdev)]
   private static extern IntPtr udev_list_entry_get_next(IntPtr listEntry);

   [DllImport(LibUdev)]
   private static extern IntPtr udev_list_entry_get_name(IntPtr listEntry);

   [DllImport(LibUdev, CharSet = CharSet.Unicode)]
   private static extern IntPtr udev_device_new_from_syspath(IntPtr udev, string syspath);

   [DllImport(LibUdev)]
   private static extern IntPtr udev_device_get_devnode(IntPtr device);

   [DllImport(LibUdev)]
   private static extern void udev_device_unref(IntPtr device);

   [DllImport(LibUdev)]
   private static extern void udev_enumerate_unref(IntPtr enumerate);
   
   [DllImport(LibUdev, CharSet = CharSet.Unicode)]
   private static extern IntPtr udev_device_get_parent_with_subsystem_devtype(IntPtr device, string subsystem, string devtype);

   private static void Main()
   {
       var udev = udev_new();
       var enumerate = udev_enumerate_new(udev);
       udev_enumerate_add_match_subsystem(enumerate, "tty");
       udev_enumerate_scan_devices(enumerate);

       var entry = udev_enumerate_get_list_entry(enumerate);
       while (entry != IntPtr.Zero)
       {
           var path = Marshal.PtrToStringAnsi(udev_list_entry_get_name(entry));
           var dev = udev_device_new_from_syspath(udev, path);
           var node = Marshal.PtrToStringAnsi(udev_device_get_devnode(dev));

           // Filter: only real hardware serial ports (USB/ACM/ttyS)
           if (!string.IsNullOrEmpty(node) && (
                   node.StartsWith("/dev/ttyUSB") ||
                   node.StartsWith("/dev/ttyACM") ||
                   node.StartsWith("/dev/ttyS")))
           {
               // Check if it belongs to a USB device
               var parent = udev_device_get_parent_with_subsystem_devtype(dev, "usb", "usb_device");
               if (parent != IntPtr.Zero || node.StartsWith("/dev/ttyS"))
               {
                   Console.WriteLine($"Serial device: {node}");
               }
           }

           udev_device_unref(dev);
           entry = udev_list_entry_get_next(entry);
       }

       udev_enumerate_unref(enumerate);
       udev_unref(udev);
   }
}


Очевидно API-а може да се разшири и да използва мониторинг за плъг/ънплъг, но предполагам от тук натам, ако решиш този вариант гугъл и чатгпт биха ти помогнали повече от мен.
Ако този метод и на теб не ти допада, то тогава NetCoreSerial изглежда ще е това, което да ти свърши работа.

Надявам се да съм помогнал.


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
thrawn
Публикувано на: 30-10-2025, 06:46
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3864
Регистриран на: 17.01.17



Гитхъбът ще свърши перфектна работа. Ще го ползвам за да видя точно какво не му харесва в системата и ще го коригирам с udev.

10x
PMEmail Poster
Top
dvader
Публикувано на: 30-10-2025, 08:11
Quote Post


Group Icon
Име: Валерий Тодоров
Група: VIP
Ранг: Почетен член

Мнения: 5419
Регистриран на: 12.07.05



Абе тоя .нет не е ли опен сорс?
Какво пречи да се види какво що и как прави?
А и да не е опен-сорс за .нет има декомпилатори, включително май в самия .нет.


--------------------
I find your lack of faith disturbing
PM
Top
relax4o
Публикувано на: 30-10-2025, 10:13
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2849
Регистриран на: 04.04.07



QUOTE (dvader @ 30-10-2025, 08:11)
Абе тоя .нет не е ли опен сорс?
Какво пречи да се види какво що и как прави?
А и да не е опен-сорс за .нет има декомпилатори, включително май в самия .нет.


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
ici
Публикувано на: 30-10-2025, 12:15
Quote Post


Group Icon
Име: Ивайло Илчев
Група: VIP
Ранг: Почетен член

Мнения: 19077
Регистриран на: 06.06.04



Виж и на Питон как става: https://github.com/pyserial/pyserial/blob/m..._ports_linux.py

ПП. Казах на Gemini да ми направи cpp код за това от питонският файл, и го компилирах в WSL/Debian, след което закачих на Дебиана една платка с УСБ ЦДЦ със https://learn.microsoft.com/en-us/windows/wsl/connect-usb. С УСБ-тата няма проблем, но вади списък с ttyS0-7 който няма нищо общо с истината.
CODE
debian@pc6136:/mnt/c/Projects/cmake/cesterminal/src/communication$ ./a.out
Available Serial Ports:
------------------------------------------------------------------------
Device:      /dev/ttyS0
Description: Serial Port
Hardware ID: N/A
------------------------------------------------------------------------
Device:      /dev/ttyS1
Description: Serial Port
Hardware ID: N/A
------------------------------------------------------------------------
Device:      /dev/ttyS2
Description: Serial Port
Hardware ID: N/A
------------------------------------------------------------------------
Device:      /dev/ttyS3
Description: Serial Port
Hardware ID: N/A
------------------------------------------------------------------------
Device:      /dev/ttyS4
Description: Serial Port
Hardware ID: N/A
------------------------------------------------------------------------
Device:      /dev/ttyS5
Description: Serial Port
Hardware ID: N/A
------------------------------------------------------------------------
Device:      /dev/ttyS6
Description: Serial Port
Hardware ID: N/A
------------------------------------------------------------------------
Device:      /dev/ttyS7
Description: Serial Port
Hardware ID: N/A
------------------------------------------------------------------------
Device:      /dev/ttyACM0
Description: NNN - NNN_FS_CDC
Hardware ID: USB VID:PID=0nnn:0nnn SER=NNNN
------------------------------------------------------------------------
debian@pc6136:/mnt/c/Projects/cmake/cesterminal/src/communication$


Това мнение е било редактирано от ici на 30-10-2025, 12:52

Прикачен файл ( Брой сваляния: 37 )
Прикачен файл  getports_linux.cpp


--------------------
Facebook is a bit like checking your underwear after a fart.
Most likely there's nothing new and if there is it's probably shit.
PMEmail PosterUsers Website
Top
thrawn
Публикувано на: 30-10-2025, 16:39
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3864
Регистриран на: 17.01.17



Проблемът е в атрибутите на устройството които драйверът му задава
CODE
/sys/class/tty/ttyS0/device
├── driver -> ../../../../../bus/serial-base/drivers/port
├── power
│   ├── async
│   ├── autosuspend_delay_ms
│   ├── control
│   ├── runtime_active_kids
│   ├── runtime_active_time
│   ├── runtime_enabled
│   ├── runtime_status
│   ├── runtime_suspended_time
│   └── runtime_usage
├── subsystem -> ../../../../../bus/serial-base
├── tty
│   └── ttyS0
│       ├── close_delay
│       ├── closing_wait
│       ├── console
│       ├── custom_divisor
│       ├── dev
│       ├── device -> ../../../00:03:0.0
│       ├── flags
│       ├── iomem_base
│       ├── iomem_reg_shift
│       ├── io_type
│       ├── irq
│       ├── line
│       ├── port
│       ├── power
│       │   ├── async
│       │   ├── autosuspend_delay_ms
│       │   ├── control
│       │   ├── runtime_active_kids
│       │   ├── runtime_active_time
│       │   ├── runtime_enabled
│       │   ├── runtime_status
│       │   ├── runtime_suspended_time
│       │   ├── runtime_usage
│       │   ├── wakeup
│       │   ├── wakeup_abort_count
│       │   ├── wakeup_active
│       │   ├── wakeup_active_count
│       │   ├── wakeup_count
│       │   ├── wakeup_expire_count
│       │   ├── wakeup_last_time_ms
│       │   ├── wakeup_max_time_ms
│       │   └── wakeup_total_time_ms
│       ├── rx_trig_bytes
│       ├── subsystem -> ../../../../../../../class/tty
│       ├── type
│       ├── uartclk
│       ├── uevent
│       └── xmit_fifo_size
└── uevent


CODE
bool isTtyS = entry.Name.StartsWith("ttyS", StringComparison.Ordinal);
bool isTtyGS = !isTtyS && entry.Name.StartsWith("ttyGS", StringComparison.Ordinal);
if ((isTtyS &&
            (File.Exists(entry.FullName + "/device/id") ||
            Directory.Exists(entry.FullName + "/device/of_node"))) ||
      (!isTtyS && Directory.Exists(entry.FullName + "/device/tty")) ||
      Directory.Exists(sysUsbDir + entry.Name) ||
      (isTtyGS && (File.Exists(entry.FullName + "/dev")))) {
      
      ...
      
}


За isTtyS се търси id или of_node които липсват. Ако мина в not isTtyS или isTtyGS проверките ще минат (но и двете са на база име в /sys но там пипа само ядрото). Друг вариант за да мине проверката е да се провали проверката за това дали sysTtyDir е налична.

Трети вариант е репорт на бъг или да си билдна сам платформата...

Давайте идеи.

Това мнение е било редактирано от thrawn на 30-10-2025, 16:43
PMEmail Poster
Top
relax4o
Публикувано на: 30-10-2025, 18:09
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2849
Регистриран на: 04.04.07



Дори и да репортнеш бъг ще паднат едни обяснения с тях, ще искат код, някакъв начин да се репликейтне, от там да решат заслужава ли си фикс и какъв да е той и накрая ще стане едно нищо. Не ти пречи да го направиш паралелно с друго решение, което вземеш, но иначе ще си чакаш.

Ако ти се занимава, можеш да пробваш тази библиотека, която имплементира libudev https://www.nuget.org/packages/Dandy.Linux.Udev/1.0.0-b2. Стара е и неподдържана, но ме съмнява нещо да се е променило значително, за да не работи.

Какъв е проблема да модифицираш метода за твоите нужди?


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
thrawn
Публикувано на: 30-10-2025, 18:32
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3864
Регистриран на: 17.01.17



Казусът е, че имам приложение на трета страна което трябва да тръгне. За да видя какво не му е на ред, правя отделно приложение само за тестове. Затова търся решение или на база платформа или на база ОС. Вариант с редакция на самото приложение няма.

Това мнение е било редактирано от thrawn на 30-10-2025, 18:34
PMEmail Poster
Top
relax4o
Публикувано на: 31-10-2025, 11:34
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2849
Регистриран на: 04.04.07



Ако си сигурен, че лежи на System.IO.Ports, то можеш да пробваш да модифицираш dll на това асембли и презапишеш модифицирана версия на метода. Можеш да пробваш с https://github.com/dnSpyEx/dnSpy, но нещата стават леко hacky.


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (3) 1 [2] 3  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0