因此,我有一个代码,可从Arduino读取传入的串行数据,并在按下特定键时也写入串行数据,我也想将此传入的串行数据写入文本文件,并且我正在使用线程。这是代码:
from pynput import keyboard
import threading
import serial
import sys
import io
class SerialReaderThread(threading.Thread):
ser = None
def run(self):
global ser
ser = serial.Serial('COM4', baudrate = 9600, timeout = 20)
while True:
print(ser.readline().decode('utf-8'))
class FileWriting(threading.Thread):
def run(self):
global ser
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):
global ser
def on_press(key):
global ser
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:
print(''.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()
现在,我的问题是我无法写入文件,读取串行数据可以正常工作,并且向Arduino的写入也可以正常工作,但是当我尝试额外写入文件时,会出现此错误。
Exception in thread Thread-3:
Traceback (most recent call last):
File "C:\Users\Tsotne\AppData\Local\Programs\Python\Python38-32\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\Users\Tsotne\AppData\Local\Programs\Python\Python38-32\project\menucode.py", line 33, in run
f.write(ser.readline().decode('utf-8'))
NameError: name 'ser' is not defined
非常感谢您的帮助,谢谢。
ser = None
移至第6行。(您在类中的使用使ser
成为类变量,而不是全局变量。)您无需声明[ C0],但要更改其值的代码块除外。因此,请删除除global ser
之前的所有字符以外的所有字符。