I want send AT commands to USB modem connected to raspberry pi. I have found some helps mentioning that USB modem is usually connected as ttyACM or ttyUSB device, but I have no ttyACM or ttyUSB device. I have devices from tty1 to tty63, but I do not know how to identify which one is used by the modem.
I have tried to find the device by storing devices list with the modem unconnected and then compare device list after the modem is pluged in:
ls /dev/ > dev_list_1.txt
(plug the modem in)
ls /dev/ | diff --suppress-common-lines -y - dev_list_.txt
returns to me:
bsg <
sda <
sg0
I have tried to connect the modem with cu tool:
sudo cu -l sda
sudo cu -l sg0
but both returns:
cu: open (/dev/sg0): Permission denied
cu: sg0: Line in use
So I tried also use minicom and configure serial communication to /dev/sg0 or /dev/sda but it does not work either.
So I think I need to find right tty device used by the modem to be able to communicate with it. But how to find it?
You can look for /sys/class/tty/*/device
entries and ignore all the links that points to serial8250 since those are not USB devices.
With shell script:
for device in /sys/class/tty/*/device
do
case $(readlink $device) in
*serial8250) # e.g. ../../../serial8250
;;
*) # e.g. ../../../1-3:3.1
echo $device | rev | cut -d/ -f2 | rev
;;
esac;
done | sed 's@^@/dev/@'
which produces
/dev/ttyACM0
/dev/ttyACM1
/dev/ttyS0
with my phone connected. You might get more than the usb devices (e.g. ttyS0) but at least this should give you all the usb serial devices the kernel know about (and if the device does not populate /sys/class/tty/ it almost certainly is not a serial device).
This is based on the list_ports
function logic in the libserialport library.