使用线程的Python串口 - 冻结电脑

-1 投票
1 回答
1520 浏览
提问于 2025-04-17 23:15

好吧,又到了提问的时候...

我现在正在尝试开发一个简单的Python程序,这个程序有一个网页视图和一个串口接口。顺便提一下,这个程序是在树莓派上运行的。

下面的代码运行得很好。但是,一旦我取消注释你看到的串口那一行,系统就会卡住。

今天过得很漫长,出于某种原因,这个问题让我脑袋都快炸了。Python不是我最擅长的语言,不过请记住,这只是一个快速的测试脚本而已... 是的,我也查过谷歌和其他资源...

#!/usr/bin/env python

import sys
import serial
import threading
import time

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

sURL = ""
sURL2 = ""
objSerial = serial.Serial(0)

def SerialLooper():
    global objSerial
    if objSerial.isOpen() == True:
        print("is_responding")
        #objSerial.write("is_responding")
        time.sleep(10)
        SerialLooper()

class TestCLASS(object):
    def __init__(self):
        global sURL
        global sURL2
        global objSerial
        objSerial = serial.Serial(0)
        sURL = "http://localhost/tester"
        app = QApplication(sys.argv)
        webMain = QWebView()
        webMain.loadFinished.connect(self.load_finished)
        webMain.load(QUrl(sURL))
        webMain.show()
        thread = threading.Thread(target=SerialLooper)
        thread.start()
        sys.exit(app.exec_())

    def load_finished(boolNoErrors):
        global sURL
        print("Url - " + sURL)
        #something here
        #something else here

newObjClass = TestCLASS()

编辑 进一步来看,似乎问题不在于多线程,而是在于serial.write()这一行。

1 个回答

0

我很久没用串口了,但我记得它在Windows上不是线程安全的。你在主线程中打开串口,然后在另一个线程中进行写操作,这样做其实是不太好的习惯。你可以考虑先写一个简单的单线程程序,看看串口是否真的能正常工作。

另外,你的程序结构也可以改进一下。你只需要一个全局声明(global objSerial),其他的其实没什么用。把那个也去掉会更好。

还有,递归调用SerialLooper()最终会因为递归深度超过限制而失败;不如直接用一个while循环来处理...

def SerialLooper():
    while objSerial().isOpen():  # Drop the == True
        # print something 
        # write to the port
        # Sleep or do whatever

撰写回答