我想利用pyqt5在pycharm上将单片机上采集到的血氧信号进行滤波和显示,并最终生成一个类似于app的交互页面实时显示。目前我需要将单片机采集到的信号波形在我用pyqt创建的页面上显示,我之前已经将单片机采集到的信号传给了上位机,这是单片机部分的相关代码供你参考:main: #include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "beep.h"
#include "relay.h"
#include "touch_key.h"
#include "bmp.h"
#include "oled.h"
#include "adc.h"
#include "stm32f10x.h"
// 全局变量
volatile uint16_t red_value = 0; // 红光ADC值
volatile uint16_t ir_value = 0; // 红外光ADC值
volatile uint8_t data_ready = 0; // 数据就绪标志
// 状态机枚举
typedef enum {
STATE_SET_RED = 0,
STATE_WAIT_RED,
STATE_SAMPLE_RED,
STATE_SET_IR,
STATE_WAIT_IR,
STATE_SAMPLE_IR
} SampleState_t;
volatile SampleState_t sample_state = STATE_SET_RED;
// 定时器3初始化(2kHz频率)
void TIM3_Int_Init(uint16_t arr, uint16_t psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能TIM3时钟
// 初始化TIM3定时器
TIM_TimeBaseStructure.TIM_Period = arr; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = psc; // 预分频器
TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 使能更新中断
// 配置NVIC中断
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, ENABLE); // 使能定时器3
}
// PB0和PB1初始化函数
void LED_Control_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 初始状态:关闭所有LED
GPIO_SetBits(GPIOB, GPIO_Pin_0);
GPIO_SetBits(GPIOB, GPIO_Pin_1);
}
int main(void)
{
// 初始化各模块
delay_init();
CORE_LED_Init();
CORE_LED_On();
led_init();
key_init();
beep_init();
relay_init();
OLED_Init();
Adc_Init();
uart_init(115200);
LED_Control_Init(); // 初始化光源控制引脚
printf("System Start...\r\n");
printf("Red and IR Light Sampling System Ready\r\n");
// 初始化定时器3为2kHz频率
// 计算公式: 72MHz / (71+1) / (49+1) = 2000Hz
TIM3_Int_Init(49, 71);
while(1)
{
// 检测数据是否就绪
if(data_ready)
{
// 按照方案A格式发送数据: R:红光值,I:红外光值
printf("R:%d,I:%d\n", red_value, ir_value);
data_ready = 0;
}
// 添加短暂延时,避免发送过快
delay_ms(2);
//
// 可选:添加按键检测等其他功能
// uint8_t key = key_scan(0);
// if(key) {
// // 处理按键
// }
}
}
// TIM3中断服务函数(2kHz频率)
void TIM3_IRQHandler(void)
{
static uint8_t settle_count = 0;
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除中断标志
switch(sample_state) {
case STATE_SET_RED:
// 设置红光:PB0=0, PB1=1
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
GPIO_SetBits(GPIOB, GPIO_Pin_1);
sample_state = STATE_WAIT_RED;
settle_count = 3; // 等待1.5ms稳定 (500us × 3)
break;
case STATE_WAIT_RED:
if(--settle_count == 0) {
sample_state = STATE_SAMPLE_RED;
}
break;
case STATE_SAMPLE_RED:
red_value = Get_Adc_Average(ADC_Channel_1, 3);
sample_state = STATE_SET_IR;
break;
case STATE_SET_IR:
// 设置红外光:PB0=1, PB1=0
GPIO_SetBits(GPIOB, GPIO_Pin_0);
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
sample_state = STATE_WAIT_IR;
settle_count = 3; // 等待1.5ms稳定
break;
case STATE_WAIT_IR:
if(--settle_count == 0) {
sample_state = STATE_SAMPLE_IR;
}
break;
case STATE_SAMPLE_IR:
ir_value = Get_Adc_Average(ADC_Channel_1, 3);
sample_state = STATE_SET_RED;
data_ready = 1; // 一对数据采集完成
break;
}
}
}
adc.c: #include "adc.h"
#include "delay.h"
// 初始化ADC
// 这里我们仅以规则通道为例
// 我们默认将开启通道0~3
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); // 使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
// PA1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); // 复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; // 顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); // 根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(ADC1, ENABLE); // 使能指定的ADC1
ADC_ResetCalibration(ADC1); // 使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); // 等待复位校准结束
ADC_StartCalibration(ADC1); // 开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); // 等待校准结束
}
// 获得ADC值
// ch: 通道值 0~3
uint16_t Get_Adc(u8 ch)
{
// 设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5); // ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换结束
return ADC_GetConversionValue(ADC1); // 返回最近一次ADC1规则组的转换结果
}
// 获取ADC多次采样的平均值
uint16_t Get_Adc_Average(u8 ch, u8 times)
{
u32 temp_val = 0;
u8 t;
for(t = 0; t < times; t++)
{
temp_val += Get_Adc(ch);
}
return temp_val / times;
}
usart.c: #include "sys.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h" //ucos 使用
#endif
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
#endif
#if EN_USART1_RX //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0; //接收状态标记
void uart_init(u32 bound){
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
//USART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
USART_Cmd(USART1, ENABLE); //使能串口1
}
void USART1_SendByte(u8 data)
{
USART_SendData(USART1, data); // 发送数据
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // 等待发送完成
}
void USART1_SendString(char *str)
{
u8 i = 0;
while (str[i] != '\0')
{
USART1_SendByte(str[i]);
i++;
// delay_ms(1); // 适当延时避免发送冲突
}
}
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntExit();
#endif
}
#endif
这是我搭建的ui代码:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1295</width>
<height>967</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_7">
<property name="styleSheet">
<string notr="true">font: 14pt "华文宋体";</string>
</property>
<property name="text">
<string>最低血氧饱和度:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_8">
<property name="styleSheet">
<string notr="true">font: 14pt "华文宋体";</string>
</property>
<property name="text">
<string>平均血氧饱和度:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_9">
<property name="styleSheet">
<string notr="true">font: 14pt "华文宋体";</string>
</property>
<property name="text">
<string>心率:</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="btn_start_2">
<property name="styleSheet">
<string notr="true">font: 12pt "华文宋体";</string>
</property>
<property name="text">
<string>开始采集</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_save_2">
<property name="styleSheet">
<string notr="true">font: 12pt "华文宋体";</string>
</property>
<property name="text">
<string>保存数据</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="2">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QLabel" name="label_2">
<property name="styleSheet">
<string notr="true">font: 10pt "华文宋体";</string>
</property>
<property name="text">
<string>界面设置</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBox_2">
<item>
<property name="text">
<string>只显示原始信号</string>
</property>
</item>
<item>
<property name="text">
<string>只显示滤波后信号</string>
</property>
</item>
<item>
<property name="text">
<string>显示所有信号</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QLabel" name="label_5">
<property name="styleSheet">
<string notr="true">font: 11pt "华文宋体";</string>
</property>
<property name="text">
<string>串口</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="combo_serial_port_2"/>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QLabel" name="label_6">
<property name="styleSheet">
<string notr="true">font: 11pt "华文宋体";</string>
</property>
<property name="text">
<string>波特率</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="combo_baudrate_2">
<property name="contextMenuPolicy">
<enum>Qt::DefaultContextMenu</enum>
</property>
<property name="maxVisibleItems">
<number>12</number>
</property>
<property name="duplicatesEnabled">
<bool>false</bool>
</property>
<item>
<property name="text">
<string>9600</string>
</property>
</item>
<item>
<property name="text">
<string>115200</string>
</property>
</item>
<item>
<property name="text">
<string>57600</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="3" column="1">
<widget class="QSlider" name="slider_lowpass">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="QtCharts::QChartView" name="graphicsView_signal"/>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1295</width>
<height>26</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<customwidgets>
<customwidget>
<class>QtCharts::QChartView</class>
<extends>QGraphicsView</extends>
<header>qchartview.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
这是·我的ui文件转换为py后的代码,名为change.py:# -*- coding: utf-8 -*-
Form implementation generated from reading ui file ‘change.ui’
Created by: PyQt5 UI code generator 5.15.9
WARNING: Any manual changes made to this file will be lost when pyuic5 is
run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(“MainWindow”)
MainWindow.resize(1295, 967)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName(“centralwidget”)
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName(“gridLayout”)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName(“horizontalLayout”)
self.label_7 = QtWidgets.QLabel(self.centralwidget)
self.label_7.setStyleSheet(“font: 14pt "华文宋体";”)
self.label_7.setObjectName(“label_7”)
self.horizontalLayout.addWidget(self.label_7)
self.label_8 = QtWidgets.QLabel(self.centralwidget)
self.label_8.setStyleSheet(“font: 14pt "华文宋体";”)
self.label_8.setObjectName(“label_8”)
self.horizontalLayout.addWidget(self.label_8)
self.label_9 = QtWidgets.QLabel(self.centralwidget)
self.label_9.setStyleSheet(“font: 14pt "华文宋体";”)
self.label_9.setObjectName(“label_9”)
self.horizontalLayout.addWidget(self.label_9)
self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 2)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName(“horizontalLayout_3”)
self.btn_start_2 = QtWidgets.QPushButton(self.centralwidget)
self.btn_start_2.setStyleSheet(“font: 12pt "华文宋体";”)
self.btn_start_2.setObjectName(“btn_start_2”)
self.horizontalLayout_3.addWidget(self.btn_start_2)
self.btn_save_2 = QtWidgets.QPushButton(self.centralwidget)
self.btn_save_2.setStyleSheet(“font: 12pt "华文宋体";”)
self.btn_save_2.setObjectName(“btn_save_2”)
self.horizontalLayout_3.addWidget(self.btn_save_2)
self.gridLayout.addLayout(self.horizontalLayout_3, 2, 0, 1, 1)
self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
self.horizontalLayout_4.setObjectName(“horizontalLayout_4”)
self.verticalLayout_4 = QtWidgets.QVBoxLayout()
self.verticalLayout_4.setObjectName(“verticalLayout_4”)
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setStyleSheet(“font: 10pt "华文宋体";”)
self.label_2.setObjectName(“label_2”)
self.verticalLayout_4.addWidget(self.label_2)
self.comboBox_2 = QtWidgets.QComboBox(self.centralwidget)
self.comboBox_2.setObjectName(“comboBox_2”)
self.comboBox_2.addItem(“”)
self.comboBox_2.addItem(“”)
self.comboBox_2.addItem(“”)
self.verticalLayout_4.addWidget(self.comboBox_2)
self.horizontalLayout_4.addLayout(self.verticalLayout_4)
self.verticalLayout_5 = QtWidgets.QVBoxLayout()
self.verticalLayout_5.setObjectName(“verticalLayout_5”)
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setStyleSheet(“font: 11pt "华文宋体";”)
self.label_5.setObjectName(“label_5”)
self.verticalLayout_5.addWidget(self.label_5)
self.combo_serial_port_2 = QtWidgets.QComboBox(self.centralwidget)
self.combo_serial_port_2.setObjectName(“combo_serial_port_2”)
self.verticalLayout_5.addWidget(self.combo_serial_port_2)
self.horizontalLayout_4.addLayout(self.verticalLayout_5)
self.verticalLayout_6 = QtWidgets.QVBoxLayout()
self.verticalLayout_6.setObjectName(“verticalLayout_6”)
self.label_6 = QtWidgets.QLabel(self.centralwidget)
self.label_6.setStyleSheet(“font: 11pt "华文宋体";”)
self.label_6.setObjectName(“label_6”)
self.verticalLayout_6.addWidget(self.label_6)
self.combo_baudrate_2 = QtWidgets.QComboBox(self.centralwidget)
self.combo_baudrate_2.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)
self.combo_baudrate_2.setMaxVisibleItems(12)
self.combo_baudrate_2.setDuplicatesEnabled(False)
self.combo_baudrate_2.setObjectName(“combo_baudrate_2”)
self.combo_baudrate_2.addItem(“”)
self.combo_baudrate_2.addItem(“”)
self.combo_baudrate_2.addItem(“”)
self.verticalLayout_6.addWidget(self.combo_baudrate_2)
self.horizontalLayout_4.addLayout(self.verticalLayout_6)
self.gridLayout.addLayout(self.horizontalLayout_4, 2, 2, 1, 1)
self.slider_lowpass = QtWidgets.QSlider(self.centralwidget)
self.slider_lowpass.setOrientation(QtCore.Qt.Horizontal)
self.slider_lowpass.setObjectName(“slider_lowpass”)
self.gridLayout.addWidget(self.slider_lowpass, 3, 1, 1, 1)
self.graphicsView_signal = QtChart.QChartView(self.centralwidget)
self.graphicsView_signal.setObjectName(“graphicsView_signal”)
self.gridLayout.addWidget(self.graphicsView_signal, 1, 0, 1, 3)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1295, 26))
self.menubar.setObjectName(“menubar”)
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName(“statusbar”)
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label_7.setText(_translate("MainWindow", "最低血氧饱和度:")) self.label_8.setText(_translate("MainWindow", "平均血氧饱和度:")) self.label_9.setText(_translate("MainWindow", "心率:")) self.btn_start_2.setText(_translate("MainWindow", "开始采集")) self.btn_save_2.setText(_translate("MainWindow", "保存数据")) self.label_2.setText(_translate("MainWindow", "界面设置")) self.comboBox_2.setItemText(0, _translate("MainWindow", "只显示原始信号")) self.comboBox_2.setItemText(1, _translate("MainWindow", "只显示滤波后信号")) self.comboBox_2.setItemText(2, _translate("MainWindow", "显示所有信号")) self.label_5.setText(_translate("MainWindow", "串口")) self.label_6.setText(_translate("MainWindow", "波特率")) self.combo_baudrate_2.setItemText(0, _translate("MainWindow", "9600")) self.combo_baudrate_2.setItemText(1, _translate("MainWindow", "115200")) self.combo_baudrate_2.setItemText(2, _translate("MainWindow", "57600"))
from PyQt5 import QtChart
我需要你将单片机发送的信号显示在Pycharm实现的界面上,注意界面的下拉框里我希望有以下可选项:显示红光,显示红外光。界面背景设计你可以自由发挥,希望有质感一点
最新发布