Python Noob - глупый вопрос? Работает в Python Interpreter, а не из CLI - PullRequest
3 голосов
/ 28 октября 2010

Я надеюсь, что это простая глупая ошибка нуба, которую можно исправить, добавив где-то одну строку кода.

Я использую pySerial для считывания последовательных данных с USB-порта и их вывода на стандартный вывод. Я использую Mac OSX 10.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 [мой последовательный порт] 9600» и бездельничаю и жду красивого потока последовательных данных - но ничего не выходит. Это просто зависает, пока я не убью процесс.

Я подумал, ну, может, по какой-то причине это не работает - поэтому я вставил несколько отладочных отпечатков в код. Я обновляю цикл while, чтобы он выглядел так:

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

Я запускаю его снова и получаю повторяющийся поток вывода «Looping ...» и «0». Я думаю, может быть, что-то не так с аргументами командной строки - поэтому я жестко запрограммировал порт и скорость передачи в скрипте, тоже самое.

Итак, почему это так? Является ли мое использование while True: каким-то образом блокирующим сценарий от принятия последовательных данных? Есть ли лучший способ сделать это?

Я полный нуб-питон. Я пишу этот сценарий, чтобы ускорить обмен данными между Adobe AIR и платой Arduino. Я надеюсь, что есть волшебная пуля, которую я могу завести сюда, чтобы она заработала - есть?

Ответы [ 3 ]

1 голос
/ 28 октября 2010

Это что-нибудь печатает?Я предположил бы, что это напечатало бы:

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

И тогда ничего.Добавьте оператор печати, чтобы он выглядел как

print ser.readline()

, и посмотрите, работает ли он.Я предполагаю, что интерпретатор печатает возвращенные строки, когда вы делаете это как команду, но в сценарии возвращаемые строки из readline () отбрасываются.

1 голос
/ 28 октября 2010

В вашем первом примере скорость передачи данных является целым числом, но во втором вы не конвертируете sys.argv[2] из строки.Попробуйте это ser = serial.Serial(serialPort, int(baudRate), timeout=1).

0 голосов
/ 28 октября 2010

Является ли мое использование while True: каким-то образом блокирование сценария от принятия последовательные данные?

Нет. Это очень стандартная практика и никак не влияет на ввод-вывод. 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)
...