Python check input from console and serial at the same time?

孤人 提交于 2019-12-11 06:16:34

问题


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


回答1:


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


来源:https://stackoverflow.com/questions/21626321/python-check-input-from-console-and-serial-at-the-same-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!