首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将文件逐行写入com0com?

如何将文件逐行写入com0com?
EN

Stack Overflow用户
提问于 2019-10-19 20:31:19
回答 1查看 588关注 0票数 2

我不能使用pyserial将多行数据从文件写入虚拟com端口(com0com)。我试图写文件逐行,以便我可以同时更新一个进度条在Tkinter。我正在Windows上运行,并尝试将写操作放在自己的线程中(每个基于Tkinter和Python的UART控制器)。我的程序在写完一行后挂起。

相关代码:

代码语言:javascript
复制
import os
import sys
from functools import partial
import re
import time
import threading

import serial
import serial.tools.list_ports

import tkinter as tk
from tkinter import ttk, filedialog

class MainApp(tk.Tk):

    def __init__(self,
                 parent,
                 title = 'Main Application',
                 *args,
                 **kwargs):

        self.parent = parent

        #Set window title and size
        self.parent.title(title)

        #Create widget container
        container = tk.Frame(self.parent)

        #Add widgets

        # --> Create load program widgets
        load_frame = tk.LabelFrame(container,
                                   text = 'Load Program',
                                   width = 400,
                                   height = 100)

        port_dropdown = DropDown(load_frame,
                                 label = 'Port:',
                                 row = 0)

        file_browser = Browser(load_frame,
                               path_type = 'file',
                               label = 'File:',
                               row = 1)

        program_downloader = Downloader(load_frame,
                                        port_dropdown,
                                        file_browser,
                                        row = 2)

        # --> Layout load program widgets
        load_frame.grid(row = 0,
                        column= 0,
                        padx = (5,5),
                        pady = (5,5))

        #Layout widget container
        container.pack(fill = tk.BOTH,
                       padx = 10,
                       pady = 5,
                       expand = True)         
.
.
.

class Downloader(tk.Frame):

    def __init__(self,
                 parent,
                 port_dropdown,
                 file_browser,
                 row = 0):

        self.port_dropdown = port_dropdown
        self.file_browser = file_browser

        #Instantiate serial port object
        self.serial_port = None

        self.progress_bar = ttk.Progressbar(parent,
                                            orient = 'horizontal',
                                            mode = 'determinate')

        self.progress_bar.grid(row = row,
                               column = 0,
                               columnspan = 2,
                               padx = (5,5),
                               pady = (5,5),
                               sticky = 'WE')

        self.button = tk.Button(parent,
                                text = 'Download',
                                command = self.download_program)

        self.button.grid(row = row,
                         column = 2,
                         padx = (5,5),
                         pady = (5,5),
                         sticky = 'W')

    def download_program(self):

        port_full_name = self.port_dropdown.combobox.get()
        port_name = re.match('([^\s]+)', port_full_name).group(0)

        baud_rate = 9600

        program_path = self.file_browser.text.get()

        self.connect(port_name,
                     baud_rate,
                     program_path)

    def connect(self,
                port_name,
                baud_rate,
                program_path):

        self.serial_port = serial.Serial(port_name,
                                         baud_rate,
                                         timeout=1)

        t1 = threading.Thread(target = self.transfer_data,
                              args = (program_path,))
        t1.daemon = True
        t1.start()

    def transfer_data(self,
                      program_path):

        line = 1
        self.progress_bar['value'] = line

        with open(program_path, 'r') as program:

            max_lines = len(program.readlines())
            self.progress_bar['maximum'] = max_lines

        with open(program_path, 'r') as program:

            while line < max_lines:

                command = program.readline().replace('\n','\r\n')

                print(str(line) + ': ' + repr(command))

                self.serial_port.write(command.encode('ascii'))

                line += 1

                self.progress_bar['value'] = line

                self.serial_port.flush()

        print('done')
        self.disconnect()

    def disconnect(self):
        self.serial_port.close()

if __name__ == '__main__':

    #Initialize Tkinter
    root = tk.Tk()

    #Create GUI
    gui = MainApp(root,
                  'Main Application')

    #Run program
    root.mainloop()

GUI挂起:

终端输出:

代码语言:javascript
复制
1: '@01\r\n'
2: '@02\r\n'

我能够在循环中第二次从program.txt读取的事实告诉我,程序可能挂起了,因为端口仍然停留在第一次写入上。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2019-10-19 21:19:33

timeoutwrite_timeout设置为0可以防止阻塞,这似乎解决了问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58467734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档