Python / PySerial / Arduino读取串行数据,然后将此精确的串行数据写入txt文件

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

由于我在第一个案例中被误解了,所以我在此情况下发表了一篇新文章...

我有一个从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读取串行数据,并且在某些特定数字被按下时......]

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

在文件顶部,您声明ser = None。您收到的错误消息表明,在ser线程尝试访问它之前,尚未将Serial对象设置为FileWriting对象。

解决此问题的快速方法是执行

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