所以,我试图通过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。有人可以帮我解决这个问题吗?
最后,我希望能够在串行读取期间输入一些键。
谢谢
您的问题基本上是,由于循环永远不会结束,因此从不执行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