Python串口与线程 - 冻结计算机

时间:2014-03-21 06:32:08

标签: python multithreading serial-port

好的,还有其他问题的时间/帖子......

所以目前我正在尝试开发一个简单的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()

1 个答案:

答案 0 :(得分:0)

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

PS你的程序结构可以使用一些工作。你只需要一个全局语句(全局objSerial),其余的什么都不做。最好摆脱那个。

当超过递归深度时,对SerialLooper()的递归调用最终会失败;为什么不只是使用while循环......

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