使用线程的Python串口 - 冻结电脑
好吧,又到了提问的时候...
我现在正在尝试开发一个简单的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