Is there a way to access a USB-serial port by the device id, not by the tty.* port?

On linux USB-serial devices create two aliases to its serial port:
/dev/tty* and /dev/serial/by-id/<my_usb_device_id>

Is there a way on OSX to identify a serial port by the USB device id? Both in System Profiler and using ioreg -p IOUSB I can see the id, but that doesn't get me any closer to connecting using that id.

We're developing several pieces of hardware and it's a pain to test them as every time I connect a different device I need to verify the serial port configuration of the testing software, because on OSX the tty.* port name depends on the port on my computer, not on the device. The guys running linux are happily using the /dev/serial/by-id/<my_usb_device_id> port to automatically distinguish between the different devices.


Actually, you should be able to find the mapping from device ID/serial number to serial port name using ioreg. Try this command:

ioreg -r -c IOUSBHostDevice -l

It will print all the USB host devices, and it will print out all properties from the subtree of each device. You should be able to find your device on the top level based on its ID or serial number. Once you've found it, you should be able to scan through its subtree, and eventually find an object of class IOSerialBSDClient. This will contain the property IODialinDevice which is what you want.

If you then want to do this programmatically, you could add the -a option to the ioreg command, which will output a plist version of the above output. You could then parse this with a library such as plistlib.

You might find it helpful to use the IORegistryExplorer app to help visualise this, as the full ioreg output is slightly difficult to read! This is available in XCode's "Hardware IO Tools" package which you can find by searching the downloads on the Apple developer site. Here's what it looks like on my device:

IORegistryExplorer example


For an FTDI bridge I have, the serial number already appears in the device name: it appears as /dev/serial/by-id/usb-FTDI_FT231X_USB_UART_DA00AG57-if00-port0 (corresponding to some /dev/ttyUSBx) on Linux, and as /dev/cu.usbserial-DA00AG57 and /dev/tty.usbserial-DA00AG57 on macOS. (See https://stackoverflow.com/a/8632603/4896937 for difference between tty.* and cu.*.)

Unfortunately, for Prolific bridge I have, an issue like yours still applies: a device appearing as /dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0 (which doesn't contain a serial number) is simply /dev/cu.usbserial and /dev/tty.usbserial on macOS (not even System Profiler gives a serial number for it). Who knows what would happen if I had a second one plugged in.

Maybe there is a more general answer out there that is vendor-independent, but be warned some devices might not report a serial number.


According to my experience, this problem comes from the driver of your serial to uart device. normally you should be able to access the serial port using

ls /dev/tty*.* 

and this is the only way to do it. But if your mac does not show it, i installed a program called serial detect, and it detected my board, otherwise use lusb before and after connecting the board, if you don't have it, install it as follows

brew install lsusb 

according to my device, i needed the following driver, for my mac 10.13

https://www.silabs.com/community/interface/knowledge-base.entry.html/2017/01/10/legacy_os_softwarea-bgvU

once installed, you can find it by

ls /dev/tty*.*

now you can flash your device or open the serial port. You can access the usb device using the device id using dfu-util, in my case 1d50:6017 is the device id shown in lsusb, i used it for flashing a blackmagic probe but you can flash what you want, dfu-util is a free utility can be installed with brew install --build-from-source dfu-util

dfu-util -d 1d50:6017 -s 0x08002000:leave -D ./src/blackmagic.bin