使用python控制 串口继电器控制电源通断
使用python控制 Kavser工具
import can
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal
from ui_mainwindow import Ui_MainWindow
import time # 导入time模块
import can
import serial
import serial.tools.list_ports
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
ports_list = list(serial.tools.list_ports.comports())
if len(ports_list) <= 0:
print("无串口设备。")
self.comboBox.addItem("无串口设备")
else:
print("可用的串口设备如下:")
for comport in ports_list:
self.comboBox.addItem(list(comport)[0])
self.pushButton_port.clicked.connect(self.on_port)
self.pushButton_start.clicked.connect(self.on_start_test)
self.pushButton_stop.clicked.connect(self.on_stop_test)
self.port_thread = PORT_Thread()
self.port_thread.port_send_signal.connect(self.on_port_show_log)
self.port_thread.port_count_signal.connect(self.on_port_count_log)
self.pushButton_port_close.clicked.connect(self.on_port_close)
def on_port(self):
global ser
serl_com = self.comboBox.currentText()
ser = serial.Serial(serl_com, 9600) # 打开COM17,将波特率配置为115200,其余参数使用默认值
if ser.isOpen(): # 判断串口是否成功打开
self.textEdit.setText("打开串口成功")
self.textEdit.append(str(ser))
global bus
bus = can.interface.Bus(bustype='kvaser', channel='0', bitrate=500000)
else:
self.textEdit.setText("打开串口失败")
def on_port_close(self):
global ser
ser.close()
self.textEdit.append("关闭串口")
def on_start_test(self):
self.port_thread.start()
self.lcdNumber.display("0")
def on_stop_test(self):
self.port_thread.close()
def on_port_show_log(self, str):
self.textEdit.append(str)
def on_port_count_log(self, int):
self.lcdNumber.display(int)
class PORT_Thread(QThread):
port_send_signal = pyqtSignal(str)
port_count_signal = pyqtSignal(int)
def __init__(self):
super(PORT_Thread, self).__init__()
self.working = True
loop_test = 0
def run(self):
global ser
global bus
loop_test = 0
self.working = True
self.port_send_signal.emit("测试开始")
while self.working:
self.port_send_signal.emit("第一步:开:0xA0, 0x01, 0x00, 0xA1")
ser.write(bytearray([0xA0, 0x01, 0x00, 0xA1]))
time.sleep(2)
msg = can.Message(arbitration_id=0x7DF, is_extended_id=False,
data=[0x02, 0x3E, 0, 0, 0, 0, 0, 0])
self.port_send_signal.emit(str("第二步:") + str("TX_ID:") + str(hex(msg.arbitration_id)) + str(" DATA:")
+' '.join(hex(x) for x in msg.data))
time.sleep(0.1)
bus.send(msg)
msg = bus.recv(1)
rx_id = msg.arbitration_id
if (msg is None) or (rx_id != 1884):
self.port_send_signal.emit("未收到CAN消息帧")
self.working = False
self.port_send_signal.emit("本轮测试结束-实验循环:" + str(loop_test))
else:
time.sleep(1)
self.port_send_signal.emit(
str("第三步:") + str("RX_ID:") + str(hex(msg.arbitration_id)) + str(" DATA:")
+ ' '.join(hex(x) for x in msg.data))
time.sleep(1)
ser.write(bytearray([0xA0, 0x01, 0x01, 0xA2]))
self.port_send_signal.emit("第四步:关:0xA0, 0x01, 0x01, 0xA2")
time.sleep(2)
loop_test = loop_test + 1
self.port_count_signal.emit(loop_test)
self.port_send_signal.emit("本轮测试结束-实验循环:" + str(loop_test))
def close(self):
self.port_send_signal.emit("测试结束")
self.working = False
self.wait()