代码之家  ›  专栏  ›  技术社区  ›  Myk

Python Noob-愚蠢的问题?在Python解释器中工作,而不是从CLI

  •  3
  • Myk  · 技术社区  · 14 年前

    我使用pySerial从USB端口读取串行数据并将其打印到标准输出。我在运行MacOSX10.6。我打开终端并键入“python”,然后执行以下操作:

    >>> import serial;
    >>> ser = serial.Serial('/dev/tty.usbserial-XXX', 9600, timeout=1);
    >>> while True:
    >>>      if ser.inWaiting() > 0:
    >>>            ser.readline();
    >>> [done, I hit enter...]
    

    import sys;
    import serial;
    
    serialPort = sys.argv[1]
    baudRate = sys.argv[2]
    
    ser = serial.Serial(serialPort, baudRate, timeout=1)
    
    while True:
        if ser.inWaiting() > 0:
            ser.readline()
    

    在命令行中,我输入“python myScript.py[my serial port]9600”,然后坐下来等待一个漂亮的串行数据流——但是什么都没有出来。它只是有点悬,直到我结束进程。

    我想,也许是因为某些原因,它不起作用-所以我在代码中放了一些调试打印。我更新while循环如下:

     while True:
        print("looping...")
        print(ser.inWaiting());
        if ser.inWaiting() > 0:
            ser.readline()
    

    那么,为什么会这样呢?我使用while是真的吗:以某种方式阻止脚本接受串行数据?有更好的办法吗?

    我是个十足的蟒蛇迷。我编写这个脚本是为了创建一种在Adobe AIR和Arduino板之间更快的通信方式。我希望有一颗神奇的子弹我能投进去让它生效-是吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Benn    14 年前

    它在打印什么吗?我想它会打印:

    looping...
    <ser.inWaiting() val>
    

    print ser.readline()
    

    看看是否有效。我猜解释器将返回的字符串作为命令打印,但在脚本中,readline()返回的字符串将被丢弃。

        2
  •  1
  •   Dana the Sane    14 年前

    在第一个例子中,波特率是一个整数,但是在第二个例子中,你没有转换 sys.argv[2] 从一根绳子上。试试这个 ser = serial.Serial(serialPort, int(baudRate), timeout=1)

        3
  •  0
  •   bukzor    14 年前

    我对while的使用是否正确:不知何故 串行数据?

    不。这是非常标准的做法,不会以任何方式影响I/O。 while True while 1 在C。

    有更好的办法吗?

    我和其他人一样担心你的论点。

    from sys import argv
    from serial import Serial
    
    try:
        baudRate = int(argv[-1])
        serialPort = argv[1:-1]
    except ValueError:
        #some nice default
        baudRate = 9600
        serialPort = argv[1:]
    
    #support paths with spaces. Windows maybe?
    serialPort = ' '.join(serialPort)
    if not serialPort:
        exit("Please specify a serial port")
    
    print( "reading from %r@%i ..." % (serialPort, baudRate) )
    ser = Serial(serialPort, baudRate, timeout=1)    
    while True:
        if ser.inWaiting() > 0:
            print( ser.readline() )
    

    如果这对您没有帮助,请通过在脚本和CLI中运行这些行来检查您是否正在使用同一个解释器。

    import sys
    print("Executable: " + sys.executable)
    print("Version: " + sys.version)