PySerial。串行读取期间无法进行任何输入

问题描述 投票:0回答:1

所以,我试图通过pyserial库使用python与Arduino进行串行通信。我有一阵子True循环,正在读取从Arduino发送的数据,但是,我希望能够通过使用ser.write从Arduino发送一些东西,但是,我无法这样做。

import serial
import sys
import time
import pynput


from pynput import keyboard


ser = serial.Serial('COM4', baudrate = 9600, timeout = 20)





while True:

        print(ser.readline().decode('utf-8'))






def on_press(key):
    try:
        print('alphanumeric key {0} pressed'.format(
            key.char))
    except AttributeError:
        print('special key {0} pressed'.format(
            key))

def on_release(key):
    print('{0} released'.format(
        key))
    if key == keyboard.Key.esc:
        return False


with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

listener = keyboard.Listener(
    on_press=on_press,
    on_release=on_release)
listener.start()

我也在使用Pynput库来查找键盘上按下的键,稍后我将进行修改,例如,如果按下键0,则进行ser.write等操作。我只是无法使其正常工作,因此它将打印任何键我一直在等待它的ser.readline。有人可以帮我解决这个问题吗?

最后,我希望能够在串行读取期间输入一些键。

谢谢

python arduino serial-port pyserial
1个回答
0
投票

您的问题基本上是,由于循环永远不会结束,因此从不执行while True循环下面的代码。因此,您基本上必须使用一种称为线程的方法,将进程分为多个部分,然后在单独的线程中运行这些部分。在下面,您可以看到可以直接使用的线程示例。KeyboardThread处理所有键盘输入,而SerialReaderThread处理串行读取调用。

from pynput import keyboard
import threading
import time
import serial
import sys

class SerialReaderThread(threading.Thread):
    def run(self):
        ser = serial.Serial('COM4', baudrate = 9600, timeout = 20)
        while True:
            print(ser.readline().decode('utf-8'))

class KeyboardThread(threading.Thread):
    def run(self):
        def on_press(key):
            try:
                print('alphanumeric key {0} pressed'.format(key.char))

                # quit when q is pressed
                if key.char == "q":
                    exit()
            except AttributeError:
                print('special key {0} pressed'.format(key))

        def on_release(key):
            print('{0} released'.format(
                key))
            if key == keyboard.Key.esc:
                return False


        with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
            listener.join()

        listener = keyboard.Listener(on_press=on_press, on_release=on_release)
        listener.start()

serial_thread = SerialReaderThread()
keyboard_thread = KeyboardThread()

serial_thread.start()
keyboard_thread.start()
serial_thread.join()
keyboard_thread.join()

您可以在此处了解有关线程及其使用方法的更多信息:https://www.tutorialspoint.com/python3/python_multithreading.htm

© www.soinside.com 2019 - 2024. All rights reserved.