MFC实现的RS232串口通信上位机软件及数据实时显示功能

版权申诉
5星 · 超过95%的资源 2 下载量 173 浏览量 更新于2024-11-15 收藏 4.68MB ZIP 举报
资源摘要信息: "MFC串口通信技术是微软基础类库(Microsoft Foundation Classes)中用于实现串行通信的一种编程接口。它通常用于个人计算机与外部设备之间进行数据交换。在本资源中,我们看到的是一套使用MFC开发的串口通信上位机软件。上位机指的是控制下位机(如嵌入式系统、单片机、传感器等)的计算机系统。本资源利用RS232串行通信标准,实现上位机与下位机之间的数据传输和通信。" 在深入探讨相关知识点前,首先解释一下标题中提及的几个术语: 1. **MFC (Microsoft Foundation Classes)**: 是微软公司提供的一套用于简化Windows编程的C++类库。它封装了Windows API(应用程序编程接口)的许多复杂功能,使得开发者可以更容易地开发出基于Windows的应用程序。 2. **串口通讯**: 是指计算机通过串行端口与外部设备进行数据交换的一种通信方式。在RS232标准中,每个信号通过串行端口的一根线发送,并且一次只发送一位。串口通信因其简单性广泛应用于早期的计算机和嵌入式系统之间。 3. **上位机**: 指的是用于监控、控制或与下位机(如微控制器、单片机等)进行通信的计算机系统。上位机常用于工业控制、数据采集和通信系统中。 4. **RS232**: 是推荐标准232(Recommended Standard 232)的缩写,是由电子工业协会(EIA)制定的异步串行通信标准。RS232广泛应用于计算机串口通信。 5. **串口上位机**: 指的是专门用于通过串口与下位机通信的软件或硬件系统。在本资源中,特指用MFC编写的上位机软件。 接下来,结合描述和标签,我们可以挖掘出以下知识要点: - **MFC在串口通信中的应用**: 在MFC编程框架中,存在一系列用于实现串口通信的类和函数。开发者可以通过继承CSerialPort类来创建串口通信对象,并设置串口参数(如波特率、数据位、停止位等),以及实现数据的发送和接收。 - **串口通信的实现步骤**: 通常包括打开串口、配置串口参数、设置通信超时、进行数据读写、关闭串口等步骤。在本资源中,MFC上位机软件能够完成这些功能,并实时显示接收到的数据。 - **数据传输**: 串口通信中数据传输方式可能是单向的也可能是双向的。在本资源中,上位机可以向上位机发送数据,并实时显示接收到的数据,说明软件支持双向数据传输。 - **软件界面**: 使用MFC编写的应用程序通常具有友好的图形用户界面。根据标题和标签描述,我们可以推断该上位机软件具备界面元素以显示和处理接收到的数据。 - **实际应用**: 这类MFC串口通信软件在自动化测试、工业控制、数据记录和实验室设备管理等领域有着广泛的应用。 - **编程技术**: 了解本资源的开发,对于学习Windows平台下的串口通信技术具有重要意义。开发者需要掌握C++编程、Windows编程概念,以及对MFC框架有一定了解。 - **通信标准**: 虽然本资源是基于RS232标准,但现代通信中还常使用USB转串口、蓝牙、Wi-Fi等其他通信方式。学习本资源后,开发者可以更容易地扩展到这些新的通信技术上。 压缩包子文件的文件名称列表提供的信息较少,仅有一个文件名 "***UATR-testhuaboxing"。由于文件名信息与资源内容无直接关联,我们无法从中获取更多信息。我们主要关注标题、描述和标签中提供的知识点。

class MainWindow(QMainWindow): def init(self, user_id): super().init() self.user_id = user_id self.initUI() # 打开串口 self.ser = serial.Serial('COM7', 9600, timeout=1) def initUI(self): # 创建用于显示员工信息的控件 self.info_label = QLabel("员工信息", self) self.info_label.move(100, 50) self.info_label.setStyleSheet("font-size: 24px; color: black; background-color: #eee; border-radius: 10px;") self.id_label = QLabel("员工ID:", self) self.id_label.move(70, 100) self.id_label.setStyleSheet("font-size: 18px; color: black;") self.name_label = QLabel("姓名:", self) self.name_label.move(70, 150) self.name_label.setStyleSheet("font-size: 18px; color: black;") self.six_label = QLabel("性别:", self) self.six_label.move(70, 200) self.six_label.setStyleSheet("font-size: 18px; color: black;") self.sfz_label = QLabel("身份证:", self) self.sfz_label.move(70, 250) self.sfz_label.setStyleSheet("font-size: 18px; color: black;") self.tel_label = QLabel("电话:", self) self.tel_label.move(70, 300) self.tel_label.setStyleSheet("font-size: 18px; color: black;") self.setFixedSize(800, 500) self.setWindowTitle('员工信息') # 查询员工信息 def query_employee(self, id): conn = pymysql.connect(host='39.99.214.172', user='root', password='Solotion.123', database='jj_tset') cursor = conn.cursor() cursor.execute("SELECT * FROM employee_table WHERE user_id='%s'" % id) result = cursor.fetchone() conn.close() return result # 读取数据 def read_data(self): data = self.ser.readline() if data: # 解析数据 id = data.decode().strip() # 查询员工信息 result = self.query_employee(id) if result: # 更新UI界面 self.id_label.setText("员工ID:" + result[0]) self.name_label.setText("姓名:" + str(result[1])) self.six_label.setText("性别:" + result[2]) self.sfz_label.setText("身份证:" + str(result[3])) self.tel_label.setText("电话:" + result[4]) print(result[0],result[1],result[2],result[3],result[4]) else: # 显示空白信息 self.id_label.setText("员工ID:") self.name_label.setText("姓名:") self.six_label.setText("性别:") self.sfz_label.setText("身份证:") self.tel_label.setText("电话:") # 定时读取数据 QTimer.singleShot(100, self.read_data) def closeEvent(self, event): # 关闭串口 self.ser.close()把这个改为多线程

2023-05-27 上传

class NextWindow(QMainWindow): def init(self, user_id): super().init() self.user_id = user_id self.initUI() # 创建串口线程 self.serial_thread = SerialThread() self.serial_thread.data_received.connect(self.handle_data) self.serial_thread_thread = threading.Thread(target=self.serial_thread.run) self.serial_thread_thread.start() def initUI(self): # 创建用于显示员工信息的控件 self.info_label = QLabel("员工信息", self) self.info_label.move(100, 50) self.info_label.setStyleSheet("font-size: 24px; color: black; background-color: #eee; border-radius: 10px;") self.id_label = QLabel("员工ID:", self) self.id_label.move(70, 100) self.id_label.setStyleSheet("font-size: 18px; color: black;") self.name_label = QLabel("姓名:", self) self.name_label.move(70, 150) self.name_label.setStyleSheet("font-size: 18px; color: black;") self.six_label = QLabel("性别:", self) self.six_label.move(70, 200) self.six_label.setStyleSheet("font-size: 18px; color: black;") self.sfz_label = QLabel("身份证:", self) self.sfz_label.move(70, 250) self.sfz_label.setStyleSheet("font-size: 18px; color: black;") self.tel_label = QLabel("电话:", self) self.tel_label.move(70, 300) self.tel_label.setStyleSheet("font-size: 18px; color: black;") self.setFixedSize(800, 500) self.setWindowTitle('员工信息') self.back_button = QPushButton('返回主界面', self) self.back_button.move(600, 400) self.back_button.clicked.connect(self.back_to_main) # 查询员工信息 def query_employee(self, id): conn = pymysql.connect(host='39.99.214.172', user='root', password='Solotion.123', database='jj_tset') cursor = conn.cursor() cursor.execute("SELECT * FROM employee_table WHERE user_id='%s'" % id) result = cursor.fetchone() conn.close() return result # 处理读取到的数据 def handle_data(self, data): # 查询员工信息 result = self.query_employee(data) if result: # 更新UI界面 self.id_label.setText("员工ID:" + result[0]) self.name_label.setText("姓名:" + str(result[1])) self.six_label.setText("性别:" + result[2]) self.sfz_label.setText("身份证:" + str(result[3])) self.tel_label.setText("电话:" + result[4]) print(result[0],result[1],result[2],result[3],result[4]) else: # 显示空白信息 self.id_label.setText("员工ID:") self.name_label.setText("姓名:") self.six_label.setText("性别:") self.sfz_label.setText("身份证:") self.tel_label.setText("电话:") def closeEvent(self, event): # 关闭串口 self.serial_thread.ser.close()怎么才能再点击返回主界面按钮时,退出串口连接

2023-05-28 上传