我在使用Mac / Linux自动检测Python中的Arduino串口时遇到了问题。
我知道一个有效的shell命令来查找端口;因为Arduino串口几乎总是以tty.usbmodem
开头,所以你可以找到ls /dev | grep tty.usbmodem
的串口,它应该返回类似tty.usbmodem262141
的内容。
但是,我对如何从Python代码调用此shell命令感到困惑。我试过这个:
p = "/dev/" + str(subprocess.Popen('ls /dev | grep tty.usbmodem', shell=True).stdout)
哪个应该p
成为/dev/tty.usbmodem262141
。
然而,目前我得到/dev/None
。
如何修改我的shell脚本调用以返回正确的字符串?我曾尝试使用several commands to call shell scripts,但没有一个有效。
答案 0 :(得分:8)
首先,如果您使用的是shell,则可以使用glob(*
),因此您的命令将变为ls /dev/tty.usbmodem*
。
接下来,您甚至不必调用shell命令在Python中使用glob!
请考虑以下代码:
import glob
print(glob.glob("/dev/tty.usbmodem*"))
答案 1 :(得分:2)
我写这篇文章是为了找出arduino在osx 10.7.x上插入的内容:享受。
#!/usr/bin/env bash
# script name: findtty.sh
# author: Jerry Davis
#
# this little script determines what usb tty was just plugged in
# on osx especially, there is no utility that just displays what the usb
# ports are connected to each device.
#
# I named this script findtty.sh
# if run interactively, then it prompts you to connect the cable and either press enter or it will timeout after 10 secs.
# if you set up an alias to have it run non-interactively, then it will just sleep for 10 secs.
# either way, this script gives you 10 seconds to plug in your device
# if run non interactively, a variable named MCPUTTY will be exported, this would be an advantage.
# it WAS an advantage to me, otherwise this would have been a 4 line script. :)
#
# to set up an alias to run non-interactively, do this:
# osx: $ alias findtty='source findtty.sh',
# or linux: $ alias findtty='. findtty.sh' (although source might still work)
\ls -1 /dev/tty* > before.tty.list
if [ -z "$PS1" ]; then
read -s -n1 -t 10 -p "Connect cable, press Enter: " keypress
echo
else
sleep 10
fi
\ls -1 /dev/tty* > after.tty.list
ftty=$(diff before.tty.list after.tty.list 2> /dev/null | grep '>' | sed 's/> //')
echo $ftty
rm -f before.tty.list after.tty.list
export MCPUTTY=$ftty # this will have no effect if running interactively
答案 2 :(得分:0)
我已经使用这段代码自动检测linux上的串口。它基于我在MAVLINK项目中找到的一些代码。
import fnmatch
import serial
def auto_detect_serial_unix(preferred_list=['*']):
'''try to auto-detect serial ports on win32'''
import glob
glist = glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*')
ret = []
# try preferred ones first
for d in glist:
for preferred in preferred_list:
if fnmatch.fnmatch(d, preferred):
ret.append(d)
if len(ret) > 0:
return ret
# now the rest
for d in glist:
ret.append(d)
return ret
def main():
available_ports = auto_detect_serial_unix()
port = serial.Serial(available_ports[0], 115200,timeout=1)
return 0
if __name__ == '__main__':
main()
答案 3 :(得分:0)
如果你想要一个纯粹的shell解决方案,解决这个问题的另一种方法是使用'ls'和awk的组合,我发现它适用于各种小众应用。
首先插入你的Arduino并确保它出现时
ls /dev/tty*
crw-rw---- 1 root dialout 166, 0 2012-10-16 18:37 /dev/ttyACM0
我的Arduino Uno显示为ttyACM *因此我将命令修改为更具选择性,然后将输出传送到awk,然后可以非常轻松地打印空格分隔的字段。
ls /dev/ttyACM* | awk {'print $9'}
/dev/ttyACM0
您仍然需要对最终输出执行某些操作,例如将其导出以在shell中使用或发送到文件以供以后阅读。