Pregunta

I am writing a python application that reads the user input (from the console):

buff = raw_input('Enter code: ')

and generates and output based on a series of algorithms.

The problem I have is that the application is also connected via serial to another machine that sets some state configuration attributes. To read a string from the serial (COM) port I'm using the PySerial library:

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

How can I check both inputs at the same time ? raw_input() stops the execution of the program until a string is submitted hence preventing to check if during that time something is being sent over the serial port. Same thing applies when waiting for input from the serial.

I would like to avoid multi-threading (the code is running on a RaspberryPi) as it would probably add an excessive level of complexity.

THANKS! mj

¿Fue útil?

Solución

Select is your friend Example taken from 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top