4

Mac/Linux を使用して、Python で Arduino のシリアル ポートを自動的に検出する際に問題があります。

ポートを見つけるためのシェルコマンドが機能していることを知っています。Arduino のシリアル ポートはほとんど常に で始まるため、次のような値を返すtty.usbmodemシリアル ポートを見つけることができます。ls /dev | grep tty.usbmodemtty.usbmodem262141

ただし、Python コードからこのシェル コマンドを呼び出す方法がわかりません。私はこれを試しました:

p = "/dev/" + str(subprocess.Popen('ls /dev | grep tty.usbmodem', shell=True).stdout)

pになるはず/dev/tty.usbmodem262141です。

しかし、現時点では/dev/None.


正しい文字列を返すようにシェル スクリプト呼び出しを変更するにはどうすればよいですか? いくつかのコマンドを使用して shell scripts を呼び出そうとしましたが、どれも機能しませんでした。

4

4 に答える 4

8

まず、シェルを使用している場合は glob( *) を使用できるため、コマンドは になりls /dev/tty.usbmodem*ます。

次に、Python でグロブを使用するためにシェル コマンドを呼び出す必要さえありません。

次のコードを検討してください。

import glob

print(glob.glob("/dev/tty.usbmodem*"))
于 2012-07-06T15:16:35.247 に答える
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
于 2012-07-25T04:14:35.500 に答える
0

純粋なシェル ソリューションが必要な場合にこれを解決する別の方法は、「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

シェルで使用するためにエクスポートしたり、後で読み取るためにファイルに送信したりするなど、最終出力で何かを行う必要があります。

于 2012-10-17T00:25:41.640 に答える
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()
于 2012-07-31T20:31:54.187 に答える