Python串行端口与线程冻结计算机



好了,是时候问下一个问题了。

所以目前我正试图开发一个简单的python程序,有一个webkit/网页视图和串行端口接口。这并不重要,但这也是在树莓派上运行的。

下面的代码可以正常工作。但是它会冻结系统,只要我取消注释串行端口行,你可以看到注释掉了。

这一天已经很长了,这一天因为某种原因让我的大脑炸了…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()

我使用串行已经有一段时间了,但是IIRC不是线程安全的(至少在Windows上)。您正在主线程中打开端口,并在另一个线程中执行写操作。无论如何,这是一种不好的做法。您也可以考虑编写一个简单的单线程程序来查看串行端口是否实际工作。

PS你的程序结构需要一些改进。您只需要一个全局语句(global objSerial),其余的什么都不做。最好把那个也去掉。

并且当超过递归深度时,对SerialLooper()的递归调用最终将失败;为什么不直接使用while循环呢…

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

最新更新