做一个简单的小程序,发送报文并在屏幕上显示。目前遇到的问题就是发送的报文无法在屏幕上显示出来,代码如下:
from __future__ import print_function
import can
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import time
import sys
import random
class MainWidget(QWidget):
sinOut1=pyqtSignal(str) #信号之文件路径
def __init__(self,parent=None):
super(MainWidget,self).__init__(parent)
self.setWindowTitle("报文发送")
self.resize(1400,600) #调整窗口大小
self.thread_tx = WORKER_tx() #定义发送报文线程
self.mesbox=QTextEdit() #报文显示栏
self.textline=QLineEdit() #文件地址显示栏
self.btnOpen = QPushButton("打开文件")
self.btnflash = QPushButton("发送文件")
self.btnRecv = QPushButton("接收文件")
layout= QGridLayout(self)
layout.addWidget(self.mesbox,0,0,5,2)
layout.addWidget(self.textline,5,0)
layout.addWidget(self.btnOpen,5,1)
layout.addWidget(self.btnflash,6,0,1,2)
layout.addWidget(self.btnRecv, 7, 0, 1, 2)
self.btnOpen.clicked.connect(self.getfile)
self.sinOut1.connect(self.show_filename)
self.btnflash.clicked.connect(self.slot_start_tx)
self.thread_tx.sinOut2.connect(self.data_flash) #定义信号与槽连接
def getfile(self): #打开文件,获得文件路径
fname,_=QFileDialog.getOpenFileName(self,'Open File','.',"Hex File(*.hex *.Hex)")
self.sinOut1.emit(str(fname))
def show_filename(self,file_name): #显示文件路径
self.textline.setText(file_name)
def slot_start_tx(self): # 发送报文线程
self.btnflash.setEnabled(False)
self.thread_tx.start()
def data_flash(self,mes):
self.mesbox.append(mes)
class WORKER_tx(QThread): # 定义线程发送数据
sinOut2 = pyqtSignal(str)
def __init__(self, parent=None):
super(WORKER_tx, self).__init__(parent)
self.working = True
'''定义发送报文通道'''
self.bus_tx = can.interface.Bus(bustype='bmcan', channel=0, bitrate=500000, data_bitrate=2000000, tres=True)
'''定义接收报文通道'''
self.bus_rx = can.interface.Bus(bustype='bmcan', channel=1, bitrate=500000, data_bitrate=2000000, tres=True)
def run(self):
while self.working == True:
data = [random.randint(0, 15) for i in range(0, 8)]
msg = can.Message(arbitration_id=0xc0ffee,data=data,is_extended_id=True)
self.bus_tx.send(msg)
time.sleep(1)
self.sinOut2.emit(str(self.bus_rx.recv())) #发送报文信号
# self.sinOut2.emit(str(msg))
self.working = False
if __name__ == '__main__':
app = QApplication(sys.argv)
demo= MainWidget()
demo.show()
sys.exit(app.exec_())
用到了Python-can, can-tools, pyqt5等模块。
我这里有一个CAN卡,两通道一个用发送报文,另一个用来接收报文。之前想过再起一个线程,用来接收报文,并把报文发送到QTextEdit当中,这种方法也实现不了。想用异步发送,然后在总线中进行轮询,还没有实施,我感觉也够呛。
编译器用的Pycharm,CAN卡是busmaster,我试过简单的发送和接受报文,这个可以实现,利用can.listenner监听报文,也可以实现,但到了Pyqt5 里面用QThread实现起来有点困难,主线程定义了操作面板,子线程用来发送,总感觉还少了点什么,没办法,刚开始学!