Jason Statham_jeb 2023-05-09 22:08 采纳率: 50%
浏览 24

pyqt5 写一个发送报文并在主页上显示的小程序

做一个简单的小程序,发送报文并在屏幕上显示。目前遇到的问题就是发送的报文无法在屏幕上显示出来,代码如下:

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实现起来有点困难,主线程定义了操作面板,子线程用来发送,总感觉还少了点什么,没办法,刚开始学!

  • 写回答

2条回答 默认 最新

  • Jason Statham_jeb 2023-05-10 10:32
    关注

    我试了一下,报错如下:

    img

    我也查了一下bus.py源文档,没有subscribe函数,因此,如果要想启用监听listener,我尝试了can.Notifier,但还是监听不到报文:

    img

    评论

报告相同问题?

问题事件

  • 修改了问题 5月9日
  • 创建了问题 5月9日

悬赏问题

  • ¥15 微信小程序 前端页面内容搜索
  • ¥15 cpu是如何判断当前指令已经执行完毕,然后去执行下条指令的
  • ¥15 C++Codeinject远线程注入
  • ¥15 安装visual studio2022时visualstudiosetup启动不了,闪退。问题代号0x0和0x1389
  • ¥30 java spring boot2.5.3版本websocket连不上
  • ¥15 angular js调外部链接查看pdf
  • ¥15 openFOAM DPMFoam
  • ¥15 将查询到的值,赋值到table指定行中
  • ¥50 docker容器内部启动shell脚本多命令
  • ¥15 请问python的selenium怎么设置referer