由于我在第一个案例中被误解了,所以我在此情况下发表了一篇新文章...
我有一个从Arduino读取串行数据的代码,当在键盘上按下某些特定数字时,会将这些数字写入Arduino。 此确切的代码在我运行时可以正常工作,它读取串行数据,并且能够将数据写入Arduino。我使用threading and PySerial库来实现这一目标。
from pynput import keyboard
import threading
import serial
import sys
ser = None
class SerialReaderThread(threading.Thread):
def run(self):
global ser
ser = serial.Serial('COM3', baudrate = 9600, timeout = 5)
while True:
print(ser.readline().decode('utf-8'))
class KeyboardThread(threading.Thread):
def run(self):
def on_press(key):
try:
format(key.char)
if key.char == "1":
ser.write(b'1\r\n') #serial write - 1
elif key.char == "2":
ser.write(b'2\r\n') #serial write - 2
elif key.char == "3":
ser.write(b'3\r\n') #serial write - 3
elif key.char == "4":
ser.write(b'4\r\n') #serial write - 4
elif key.char == "5":
ser.write(b'5\r\n') #serial write - 5
elif key.char == "6":
ser.write(b'6\r\n') #serial write - 6
elif key.char == "0":
ser.write(b'0\r\n') #serial write - 0
except AttributeError:
format(key)
with keyboard.Listener(on_press=on_press) as listener:
listener.join()
listener = keyboard.Listener(on_press=on_press)
listener.start()
serial_thread = SerialReaderThread()
keyboard_thread = KeyboardThread()
serial_thread.start()
keyboard_thread.start()
serial_thread.join()
keyboard_thread.join()
[此后我有一个想法,就是我也可以完全按照我正在Windows上打印到.txt文件的格式写入此串行数据。因此,我创建了一个名为FileWriting的新线程,并决定只向其中写入ser.readline()。decode('utf-8'),但是不再起作用。 ..这是我编写并写入.txt文件的新修改的代码。
from pynput import keyboard
import threading
import serial
import sys
import io
ser = None
class SerialReaderThread(threading.Thread):
def run(self):
global ser
ser = serial.Serial('COM3', baudrate = 9600, timeout = 5)
while True:
print(ser.readline().decode('utf-8'))
class FileWriting(threading.Thread):
def run(self):
while True:
with io.open("output.txt", "a", encoding="utf-8") as f:
f.write(ser.readline().decode('utf-8'))
class KeyboardThread(threading.Thread):
def run(self):
def on_press(key):
try:
format(key.char)
if key.char == "1":
ser.write(b'1\r\n') #serial write - 1
elif key.char == "2":
ser.write(b'2\r\n') #serial write - 2
elif key.char == "3":
ser.write(b'3\r\n') #serial write - 3
elif key.char == "4":
ser.write(b'4\r\n') #serial write - 4
elif key.char == "5":
ser.write(b'5\r\n') #serial write - 5
elif key.char == "6":
ser.write(b'6\r\n') #serial write - 6
elif key.char == "0":
ser.write(b'0\r\n') #serial write - 0
except AttributeError:
format(key)
with keyboard.Listener(on_press=on_press) as listener:
listener.join()
listener = keyboard.Listener(on_press=on_press)
listener.start()
serial_thread = SerialReaderThread()
keyboard_thread = KeyboardThread()
file_thread = FileWriting()
serial_thread.start()
keyboard_thread.start()
file_thread.start()
serial_thread.join()
keyboard_thread.join()
file_thread.join()
很明显,我只添加了一个名为file_thread的新线程,现在当我运行串行数据的代码打印时,以及将数据写入Arduino都可以正常工作,但是,代码没有将任何内容写入.txt。文件,并给我一个错误:
Exception in thread Thread-3:
Traceback (most recent call last):
File "C:\Python\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\Users\ultra\Desktop\work\menucode.py", line 32, in run
f.write(ser.readline().decode('utf-8'))
AttributeError: 'NoneType' object has no attribute 'readline'
[如果有人在读取串行数据并写入文本文件时遇到了与Arduino类似的问题,或者如果有人知道如何解决此问题,请让我知道我现在非常拼命,一切都值得赞赏。] >
我在此情况下发表了一篇新文章,因为我在第一个案例中被误解了。我有一个代码可以从Arduino读取串行数据,并且在某些特定数字被按下时......]
在文件顶部,您声明ser = None
。您收到的错误消息表明,在ser
线程尝试访问它之前,尚未将Serial
对象设置为FileWriting
对象。
解决此问题的快速方法是执行