我需要有关python脚本的帮助我正在努力适应特定需求

时间:2011-07-27 13:22:42

标签: python

我是Python的新手,我通常使用Perl。

我有一个Arduino连接了一些我用来控制网络摄像头的伺服系统,有问题的脚本完美无缺,伺服系统接收指令并做他们应该做的事情:

    #!/usr/bin/env python
    import serial

    usbport = '/dev/ttyACM0'

    # Set up serial baud rate
    ser = serial.Serial(usbport, 9600, timeout=1)


    def move(servo, angle):
        '''Moves the specified servo to the supplied angle.

        Arguments:
        servo
          the servo number to command, an integer from 1-4
        angle
         the desired servo angle, an integer from 0 to 180

    (e.g.) >>> servo.move(2, 90)
           ... # "move servo #2 to 90 degrees"'''

    if (0 <= angle <= 180):
       ser.write(chr(255))
       ser.write(chr(servo))
       ser.write(chr(angle))
    else:
        print "Servo angle must be an integer between 0 and 180.\n"

基本上,上述脚本的命令是:

    python
    import servo
    servo.move(1, 180)

我已将脚本转换为接受命令行输入,但程序似乎不起作用。任何人都可以弄清楚我做错了什么,这是我的版本:

    #!/usr/bin/env python
    import serial
    import sys

    try:
            servo = int(sys.argv[1])
            angle = int(sys.argv[2])
    except IndexError:
            print ('a servo and angle are required')
    sys.exit(2)

    # Set up serial baud rate
    usbport = '/dev/ttyACM0'
    ser = serial.Serial(usbport, 9600, timeout=1)

    def move(servo, angle):
        '''Moves the specified servo to the supplied angle.

    Arguments:
        servo
          the servo number to command, an integer from 1-4
        angle
          the desired servo angle, an integer from 0 to 180

    (e.g.) >>> servo.move(2, 90)
           ... # "move servo #2 to 90 degrees"'''

    if (0 <= angle <= 180):
        ser.write(chr(255))
        ser.write(chr(servo))
        ser.write(chr(angle))
    else:
        print "Servo angle must be an integer between 0 and 180. You typed:"
        print servo
        print angle
    move(servo, angle)

基本上,上述脚本的命令是:

    servo.py 1 180

我知道脚本的工作原理应该好像我告诉它做了1 181我得到了角度超出范围的错误,所以我完全不知道为什么信息没有传递给序列/ Arduino的。

非常感谢任何帮助,并为这篇冗长的帖子感到抱歉。

吉尔伯特

4 个答案:

答案 0 :(得分:2)

@combatdave's answer旁边,在这一部分:

try:
        servo = int(sys.argv[1])
        angle = int(sys.argv[2])
except IndexError:
        print ('a servo and angle are required')
sys.exit(2)

# Set up serial baud rate

你也应该对sys.exit(2)进行限制。因此,程序在获得参数后立即退出。

答案 1 :(得分:1)

看起来你的缩进是在函数定义错误之后。它应该是:

def move(servo, angle):
    '''Moves the specified servo to the supplied angle.

    Arguments:
        servo
          the servo number to command, an integer from 1-4
        angle
          the desired servo angle, an integer from 0 to 180

    (e.g.) >>> servo.move(2, 90)
           ... # "move servo #2 to 90 degrees"'''

    if (0 <= angle <= 180):
        ser.write(chr(255))
        ser.write(chr(servo))
        ser.write(chr(angle))
    else:
        print "Servo angle must be an integer between 0 and 180. You typed:"
        print servo
        print angle

(注意if ... else块是如何缩进的)

答案 2 :(得分:0)

为什么要调整原始脚本?只需使用:

import servo
servo.move(int(argv[1]), int(argv[2]))

我不确定在将代码粘贴到stackoverflow时是否会发生这种情况,但是缩进在多个地方存在缺陷。请检查一下:)

答案 3 :(得分:0)

你的缩进基本上是错误的。

请参阅此代码段:

try:
        servo = int(sys.argv[1])
        angle = int(sys.argv[2])
except IndexError:
        print ('a servo and angle are required')
sys.exit(2)

始终执行sys.exit(2)来电!所以程序什么都不做。