I'm trying to connect to a device using UART though a micro-USB cable and GNU screen from Ubuntu and OSX.

On both Ubuntu and OSX I can get the most recent serial connection with the following command, which I have run just after having connected my device and turned it on.

ls -t /dev/tty* | head -n 1

On Ubuntu I get (this is actually the output of ll and -n 3 so I can see better what's shown)

crw-rw---- 1 root dialout 166,  0 Jan 29 10:51 /dev/ttyACM0
crw-rw-rw- 1 root tty       5,  0 Jan 29 10:14 /dev/tty
crw-rw---- 1 root dialout   4, 68 Jan 21 16:19 /dev/ttyS4

and the first item is correct (i.e. I can screen /dev/ttyACM0 115200).

On Mac, instead, I get this

crw--w----  1 atcold  tty     16,   4 29 Jan 10:56 /dev/ttys004
crw-rw-rw-  1 root    wheel   19,  44 29 Jan 10:56 /dev/tty.usbmodemfd121
crw--w----  1 atcold  tty     16,   6 28 Jan 16:21 /dev/ttys006

and the first item is wrong (I cannot connect to it) whereas the working one is the second one (and I had to turn off and turn on my device twice, since the first time there was not any /dev/tty.usbmodemfd121 at all).


My question is easy. How can I access automatically the correct serial connection? I'm trying to avoid to give too many troubles to the final user trying to sort this problem out automatically.


This is my final script :)

read -p "Connect the switched off board, then press <Enter>" temp
ls /dev/tty* > /tmp/old_tty
read -p "Turn on the board and press <Enter>" temp
ls /dev/tty* > /tmp/new_tty
screen $(comm -13 /tmp/old_tty /tmp/new_tty) 115200

A solution could be to dectect the active serial connection before and after plugging the micro-usb, and then connect to the one present only after the micro-usb is plugged. This can be done for example with an sh script


read -p "Be sure the mini usb adapter is unplugged then press ENTER" temp
read -p "Now plug device and then press ENTER" temp
# sleep 2 seconds to be sure the filedevise is created
sleep 2



for file in $AFTER ; do
    if case ${BEFORE} in *"${file}"*) false;; *) true;; esac; then


#Now do whatever with FOUND device
echo $FOUND
  • LOL, I cannot believe I had /dev/ttys004 also before connecting my device (since its time stamp, I was sure it was generated by connecting my device)! Do you have any suggestion (sh code snippet) about detecting the new active serial connection?
    – Atcold
    Jan 29 '14 at 21:05
  • @Atcold I added a sample sh script
    – Alepac
    Jan 30 '14 at 16:15
  • A-W-E-S-O-M-E-!-!-!
    – Atcold
    Feb 3 '14 at 19:39

You might want to look at setting up a udev rule to create a symlink with a specific name for this serial device.

Assuming you can identify the device by vendor or serial number.

This should help:


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.