Version
Python3.7
PySerial3.4
PyQt5.8+
在一个实例类中
1.先导入串口依赖包
2.串口实例化(初始化)
3.串口发送数据(上位机请求指令)
4.串口开启线程接收数据(上位机得到响应指令)
5.上位机把得到的响应指令解析出来,并返回用户界面
具体示例
1.先导入串口PySerial依赖包
pip安装依赖包:
pip install pyserial >= 3.4
在模块头文件导入:
import serial.tools.list_ports
2.串口实例化(初始化),在类中示例
self.port = serial.Serial() # 实例化串口
# 打开串口:
def port_open(self):
"""
打开串口
"""
if not self.port.isOpen():
self.port.port = self.com_list[-1] # 这里获取最后(最新)一个串口
self.port.baudrate = 9600 # 波特率
self.port.bytesize = 8 # 数据位
self.port.stopbits = 1 # 停止位
try:
self.port.open()
except Exception as e:
# noinspection PyCallByClass
QMessageBox.critical(self, "Port Error", "串口打开失败!\n{0}".format(e))
3.串口发送数据(上位机请求指令)
def read_module_all(self):
"""
PC上位机发送请求读取指令,
PC上位机接收数据要开启线程
:return:
"""
if self.port.isOpen():
try:
self.port.write(MyMainSerial.fun_pc_read_cmd()) # 上位机先发送<请求读取>指令
# 接收数据要开启线程
self.serial_thread = threading.Thread(target=self.read_module_data)
self.serial_thread.setDaemon(True)
self.serial_thread.start()
except Exception as e:
print('PC接收数据(read_module_all)', e)
4.串口开启线程接收数据(上位机得到响应指令)
# 接收数据要开启线程
self.serial_thread = threading.Thread(target=self.read_module_data)
self.serial_thread.setDaemon(True)
self.serial_thread.start()
def read_module_data(self):
"""
接收信息的具体流程
:return:
"""
read_times = 0
while True:
if read_times < 86400
try:
time.sleep(0.5)
num = self.port.inWaiting()
except Exception as e:
print('>>error PC接收数据(read_module_data),已关闭串口', e)
num = 0
if num > 0:
try:
data_8 = bytearray()
data_8 = self.port.read(48)
crc_three, out_s = MyMainSerial.rec_module_cmd(data_8)
if crc_three == out_s.strip()[-9:]:
time.sleep(0.2)
# noinspection PyCallByClass
self.module_msg = MyMainSerial.text_main_table__message(self, out_s)
self.signal_write_table.emit('update')
except Exception as e:
print('>>error 接收数据异常<read_module_data>:', e)
self.port.write(MyMainSerial.fun_pc_read_cmd())
read_times += 1
time.sleep(0.2)
else:
if self.port.isOpen():
self.port.write(MyMainSerial.fun_pc_read_cmd())
read_times += 1
time.sleep(0.2)
5.上位机把得到的响应指令解析出来,并返回用户界面
def text_main_table__message(self, out_s):
"""
响应<上位机读取指令>的数据解析 - 信息获取
:param out_s: 响应指令<str>
:return: array_two[截取0x前缀的数据]<list[str16]>
"""
array_list = list()
array_list.append(out_s.split()) # 按空格截取追加到array_list列表里面
# 截取0x前缀
array_two = list()
for i in range(len(array_list[0])):
array_two.append(array_list[0][i][2:])
print('截取0x前缀后的列表:', array_two)
return array_two