1949啦网--小小 痛苦,是因为能力和欲望不匹配造成的

编写QT串口上位机接收stm32串口发送的数据

QT串口上位机的代码

#include "mainwindow.h"  #include "ui_mainwindow.h"    MainWindow::MainWindow(QWidget *parent) :      QMainWindow(parent),      ui(new Ui::MainWindow)  {      ui->setupUi(this);      ui->pushButton->setEnabled(false);      serial=new QSerialPort(this);      updateSerialPortMenu();      connect(ui->pushButton,&QPushButton::clicked,this,[=]()      {          if(serial->isOpen())          {              ui->pushButton->setText("打开串口");               ui->label->setText("串口"+currentPortName+"已关闭");              serial->close();          }else          {             serialControl();          }        });      QAction *refreshAction=new QAction("刷新串口",this);      menuBar()->addAction(refreshAction);      connect(refreshAction,&QAction::triggered,this,&MainWindow::refreshSerialPortList);      connect(serial,&QSerialPort::readyRead,this,&MainWindow::readSerialData);      connect(serial,SIGNAL(error(QSerialPort::SerialPortError)),this,SLOT(handleSerialError(QSerialPort::SerialPortError)));  }    //如果中途出现串口断开的处理槽函数  void MainWindow::handleSerialError(QSerialPort::SerialPortError error)  {        if(error==QSerialPort::PermissionError)      {          ui->pushButton->setText("打开串口");          ui->label->setText("串口"+currentPortName+"异常关闭");          serial->close();      }  }    void MainWindow::readSerialData()//处理单片机传过来的数据的槽函数  {      QByteArray data =serial->readAll();      ui->textEdit->append(QString::fromUtf8(data));    }  //刷新串口端口的槽函数  void MainWindow::refreshSerialPortList()  {      //清除旧菜单项      for(QAction*action: protactionGroup->actions())      {        ui->menuSerialPorts->removeAction(action);        protactionGroup->removeAction(action);        delete action;      }      //再重新添加扫描到的串口      const auto ports=QSerialPortInfo::availablePorts();      for(const QSerialPortInfo &info:ports )      {          QAction *protAction=new QAction(info.portName(),this);          protAction->setCheckable(true);          protactionGroup->addAction(protAction);          ui->menuSerialPorts->addAction(protAction);      }      ui->menuSerialPorts->setEnabled(true);      ui->label->setText("串口菜单已刷新");      ui->pushButton->setText("打开串口");    }    void MainWindow::serialControl()  {      if(serial->open(QIODevice::ReadWrite))      {          serial->clear(QSerialPort::AllDirections);//清除缓冲区,要不然一开始接收的字符可能是乱码          ui->pushButton->setEnabled(true);          ui->pushButton->setText("关闭串口");          ui->textEdit->clear();          ui->label->setText("串口"+currentPortName+"已打开");          serial->setBaudRate(QSerialPort::Baud115200);          serial->setDataBits(QSerialPort::Data8);          serial->setParity(QSerialPort::NoParity);          serial->setStopBits(QSerialPort::OneStop);          serial->setFlowControl(QSerialPort::NoFlowControl);      }      else      {           ui->label->setText("串口"+currentPortName+"打开失败");          //弹窗提示          QMessageBox::information(this,"串口打开失败","无法打开串口"+currentPortName+".\n请检查是否被其他程序占用或不存在.");      }    }    //当用户选择了对应的串口端口后进行的处理  void MainWindow::onSerialPorSelected(QAction *action)  {        QString selectedPort = action->text();      currentPortName=selectedPort;      serial->setPortName(selectedPort);      ui->menuSerialPorts->setEnabled(false);      if(serial->isOpen())      {          serial->close();      }        serialControl();    }    void MainWindow::updateSerialPortMenu()  {        ui->menuSerialPorts->clear();//清除旧的菜单栏      protactionGroup=new QActionGroup(this);//用于管理互斥选择      protactionGroup->setExclusive(true);      foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())      {          QAction *protAction=new QAction(info.portName(),this);          protAction->setCheckable(true);          protactionGroup->addAction(protAction);          ui->menuSerialPorts->addAction(protAction);      }        //连接槽函数:当用户点击某个串口菜单项时     // connect(protactionGroup,&QActionGroup::triggered,this,&MainWindow::onSerialPorSelected);//这句话用Lambda表示如下:      connect(protactionGroup,&QActionGroup::triggered,this,[this](QAction *action)      {          QString selectSerial=action->text();          qDebug()<<"select Serial Port:"<<selectSerial;          this->onSerialPorSelected(action);        });    }        MainWindow::~MainWindow()  {      delete ui;  }



stm32的串口代码(使用定时器定时往串口发送数据)

#include "timer.h"    uint8_t timer_flag = 0;  void Timer_NVIC(void)  {  	NVIC_InitTypeDef NVIC_InitStructure;    	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  	NVIC_Init(&NVIC_InitStructure);   }    void Timer_Config(void)  {  	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);     /* Time Base configuration */     TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;     TIM_TimeBaseStructure.TIM_Period = 10000-1;     TIM_TimeBaseStructure.TIM_ClockDivision = 0;     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);     Timer_NVIC();     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);  	/* TIM3 counter enable */  	TIM_Cmd(TIM2, ENABLE);   	  }    void TIM2_IRQHandler()  {  	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)  	{  		timer_flag=1;  		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);  	}  }      #include "usart.h"    void Usart_Config(void)  {  	GPIO_InitTypeDef GPIO_InitStructure;  	USART_InitTypeDef USART_InitStructure;  	/* Enable GPIO clock */     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);  	        /* Configure USARTy Rx as input floating */     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;     GPIO_Init(GPIOA, &GPIO_InitStructure);          /* Configure USARTy Tx as alternate function push-pull */     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     GPIO_Init(GPIOA, &GPIO_InitStructure);  		     USART_InitStructure.USART_BaudRate = 115200;     USART_InitStructure.USART_WordLength = USART_WordLength_8b;     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;          /* Configure USARTy */     USART_Init(USART1, &USART_InitStructure);        /* Enable USARTz */     USART_Cmd(USART1, ENABLE);    }    void Usart_send(uint8_t ch)   {     /* Place your implementation of fputc here */     /* e.g. write a character to the USART */     USART_SendData(USART1, (uint8_t) ch);        /* Loop until the end of transmission */     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)     {}      }      void Usart_sendBuff(uint8_t *buf,uint32_t size)  {  	for(uint32_t i=0;i<size;i++)  	{  		Usart_send(buf[i]);  	}  }     //¶¨Ê±·¢ËÍ   void Send_Handle()   {   	uint8_t xiao[9]="xiaoxiao";  		if(timer_flag==1)  		{  			timer_flag=0;  			Usart_sendBuff(xiao,sizeof(xiao));  		}   }

微信扫码关注

更新实时通知

作者:xiao 分类:软件笔记 浏览: