Как остановить последовательное чтение на клавиатуре - PullRequest
0 голосов
/ 08 декабря 2018

Итак, я пытаюсь создать программу, которая считывает последовательный порт моего Arduino.Это все работает нормально, но проблема в том, что я не могу остановить это, когда хочу.Мой arduino продолжает посылать данные (что нормально), но мой скрипт останавливается только после 100 чтений строк (как я установил).После этих 100 чтений список сохраняется в CSV-файл.Как я могу остановиться раньше, например, после ввода «stop» или «exit» в терминале И все еще сохранять свои данные?Ctrl + C просто останавливает мой скрипт без сохранения.

Мой код:

import serial
import csv
import re
import pandas as pd
import time

portPath = "/dev/cu.usbmodem1411"       
baud = 9600                     
timeout = 5     # Seconds
filename = time.strftime("%Y%m%d") + "_shieldv1_water_data.csv"
max_num_readings = 100

def create_serial_obj(portPath, baud_rate, tout):
return serial.Serial(portPath, baud_rate, timeout = tout)

def read_serial_data(serial):
serial.flushInput()     # buffer flush

serial_data = []
readings_left = True
timeout_reached = False

while readings_left and not timeout_reached:
    serial_line = serial.readline()
    if  serial_line == '':
        timeout_reached = True
    else:  
        serial_data.append(serial_line.decode('utf-8'))
        if len(serial_data) == max_num_readings:
            readings_left = False

return serial_data

def save_to_csv(data, filename):
with open(filename, 'w') as csvfile:
    csvwrite = csv.writer(csvfile, delimiter = '\n')
    csvwrite.writerow(data)


serial_obj = create_serial_obj(portPath, baud, timeout)

print("Reading serial data...")
serial_data = read_serial_data(serial_obj)

print("Saving to csv...")
save_to_csv(serial_data, filename)

print("Saved.")

1 Ответ

0 голосов
/ 08 декабря 2018

Вы можете использовать функцию check_input () ниже.Поместите его в свой цикл и прервите его, если возвращаемое значение не None.Poll () проверяет стандартный буфер ввода на наличие символов после новой строки и, если они есть, читает их.

import select,sys,time

def check_input():

    po= select.poll()   
    po.register(sys.stdin.fileno(), select.POLLIN)  
    events= po.poll(0) 
    if events:
        for fno,ev in events:     
            if fno == sys.stdin.fileno():  
                return(input())
    return None

# testing:
if __name__ == "__main__":
   while True:
        s=check_input()
        if s:
            print("From keyboard:",s)
            break
        time.sleep(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...