Если это - чужая железяка, то нечего "перевтыкать" по-другому. Каждому переходнику свой разъем USB, тогда будет стабильно по /dev/serial/by-path.можно перевтыкать по другому, и все попутается
А если железяка своя, то вообще проблем нет идентифицировать. Я для всех своих более-менее свежих железяк в конфигурации даю возможность настраивать название интерфейса, чтобы потом udev-скрипт создавал /dev/[ifacename]_X вместо безликих /dev/ttyACMX с одними и теми же VID/PID.
Втыкаю три своих преобразователя CAN-USB в любые разъемы USB и могу однозначно идентифицировать. Да и не только CAN-USB: я по умолчанию везде в железяках использую VID/PID от ST'шных virtual serial device. Только по имени интерфейса и можно различить.
Отдельный случай - когда в одном устройстве несколько интерфейсов (я уже писал про свою "мультипортовую плату"), здесь единственный вменяемый способ различить интерфейсы - по разным их именам (например, /dev/canusb_0, /dev/rs232a_0, /dev/rs232b_0, /dev/rs485a_0, /dev/rs485b_0 и так далее для всех семи интерфейсов).
Кстати, свой CAN-USB я не так давно хорошо проапгрейдил. Решил: зачем там столько неиспользуемых ног (таки корпус-то 48-ногий!). На плате развел контактные площадки, чтобы ко многим ногам можно было подпаяться. И вторым интерфейсом USB сделал интерфейс работы со всем этим чудом. Можно сконфигурировать АЦП, ШИМ, UART, I2C и так далее. Ну и, понятно, тупым ногодрыгом GPIO. Дипсик неплохой Readme по коду сгенерил, разве что правил я его почти час, т.к. там кое-что он "забыл" упомянуть, а кое-что приврал.


