Python同时从控制台和串口检查输入?

时间:2014-02-07 11:15:16

标签: python console serial-port raspberry-pi pyserial

我正在编写一个python应用程序读取用户输入(从控制台)

buff = raw_input('Enter code: ')

并根据一系列算法生成和输出。

我遇到的问题是应用程序也通过串行连接到另一台设置某些状态配置属性的计算机。 要从串行(COM)端口读取字符串,我正在使用PySerial库:

ser = serial.Serial('/dev/ttyAMA0')
ser.baudrate = 115200
[...]
if not(ser.isOpen()):
  ser.open()
s = ser.readline()

如何同时检查两个输入? raw_input()停止执行程序,直到提交一个字符串,因此阻止检查在此期间是否通过串口发送了什么。在等待串行输入时同样适用。

我想避免多线程(代码在 RaspberryPi 上运行),因为它可能会增加过多的复杂性。

谢谢! MJ

1 个答案:

答案 0 :(得分:3)

选择是你的朋友 取自here

的示例
import sys
import select
import time

# files monitored for input
read_list = [sys.stdin]
# select() should wait for this many seconds for input.
# A smaller number means more cpu usage, but a greater one
# means a more noticeable delay between input becoming
# available and the program starting to work on it.
timeout = 0.1 # seconds
last_work_time = time.time()

def treat_input(linein):
  global last_work_time
  print("Workin' it!", linein, end="")
  time.sleep(1) # working takes time
  print('Done')
  last_work_time = time.time()

def idle_work():
  global last_work_time
  now = time.time()
  # do some other stuff every 2 seconds of idleness
  if now - last_work_time > 2:
    print('Idle for too long; doing some other stuff.')
    last_work_time = now

def main_loop():
  global read_list
  # while still waiting for input on at least one file
  while read_list:
    ready = select.select(read_list, [], [], timeout)[0]
    if not ready:
      idle_work()
    else:
      for file in ready:
        line = file.readline()
        if not line: # EOF, remove file from input list
          read_list.remove(file)
        elif line.rstrip(): # optional: skipping empty lines
          treat_input(line)

try:
    main_loop()
except KeyboardInterrupt:
  pass