完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
实现STM32开发板向计算机传送数据就需要准备好STM32开发板和上位接收程序。
上位机部分使用QT开发,版本为5.8.0 STM32部分使用STM32F429芯片,开发环境为uVision V5.24.2.0 上位机效果为: 代码如下: mainwindow.h文件: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include #include namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_clearButton_clicked(); void on_sendButton_clicked(); void on_openButton_clicked(); void Read_Data(); private: Ui::MainWindow *ui; QSerialPort *serial; }; #endif // MAINWINDOW_H mainwindow.cpp文件: #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //查找可用的串口 foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { QSerialPort serial; serial.setPort(info); if(serial.open(QIODevice::ReadWrite)) { ui -> PortBox ->addItem(serial.portName()); serial.close(); } } //设置波特率下拉菜单默认显示第三项 ui -> BaudBox -> setCurrentIndex(3); //关闭发送按钮的使能 ui -> sendButton -> setEnabled(false); qDebug() << tr("界面设定成功!"); } MainWindow::~MainWindow() { delete ui; } //清空接收窗口 void MainWindow::on_clearButton_clicked() { ui -> textEdit -> clear(); } void MainWindow::on_sendButton_clicked() { serial -> write(ui -> textEdit_2 -> toPlainText().toLatin1()); } void MainWindow::Read_Data() { QByteArray buf; buf = serial -> readAll(); if(!buf.isEmpty()) { QString str = ui -> textEdit -> toPlainText(); str += tr(buf); ui -> textEdit -> clear(); ui -> textEdit -> append(str); } buf.clear(); } void MainWindow::on_openButton_clicked() { if(ui -> openButton -> text() == tr("打开串口")) { serial = new QSerialPort; //设置串口名 serial -> setPortName(ui -> PortBox -> currentText()); //打开串口 serial -> open(QIODevice::ReadWrite); //设置波特率 serial -> setBaudRate(ui -> BaudBox -> currentText().toInt()); //设置数据位 switch(ui -> BitNumBox -> currentIndex()) { case 8: serial -> setDataBits(QSerialPort::Data8); break; default: break; } //设置奇偶校验位 switch(ui -> ParityBox -> currentIndex()) { case 0: serial -> setParity(QSerialPort::NoParity); break; default: break; } //设置停止位 switch(ui -> StopBox -> currentIndex()) { case 1: serial -> setStopBits(QSerialPort::OneStop); break; case 2: serial -> setStopBits(QSerialPort::TwoStop); break; default: break; } //设置控制流 serial -> setFlowControl(QSerialPort::NoFlowControl); //关闭设置菜单使能 ui -> PortBox -> setEnabled(false); ui -> BaudBox -> setEnabled(false); ui -> BitNumBox -> setEnabled(false); ui -> ParityBox -> setEnabled(false); ui -> StopBox -> setEnabled(false); ui -> openButton -> setText(tr("关闭串口")); ui -> sendButton -> setEnabled(false); } else { //关闭串口 serial -> clear(); serial -> close(); serial -> deleteLater(); //恢复设置使能 ui -> PortBox -> setEnabled(true); ui -> BaudBox -> setEnabled(true); ui -> BitNumBox -> setEnabled(true); ui -> ParityBox -> setEnabled(true); ui -> StopBox -> setEnabled(true); ui -> openButton -> setText(tr("打开串口")); ui -> sendButton -> setEnabled(true); } //连接信号槽 QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data); } main.c文件为: #include "mainwindow.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } STM32硬件驱动程序代码如下: main.c文件: #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" int main(void) { u8 t; u8 len; u16 times = 0; Stm32_Clock_Init(360, 25, 2, 8); delay_init(180); uart_init(90, 115200); LED_Init(); while(1) { if(USART_RX_STA & 0x8000) { len = USART_RX_STA & 0x3fff; printf("rn You send information is: rn"); for(t = 0; t < len; t++) { USART1 -> DR = USART_RX_BUF[t]; while(0 == (USART1 -> SR & 0x40)); } printf("rnrn"); USART_RX_STA = 0; } else { times++; if(0 == times % 5000) { printf("rnALIENTEK MXX STM32F4/F7 develop board Serial testrn"); printf("mengxiangxing@MXXrnrnrn"); } if(0 == times % 200) { printf("Please input data and end with ENTERrn"); } if(0 == times % 30) { LED0 = !LED0; } delay_ms(10); } } } 串口初始化代码: void uart_init(u32 pclk2,u32 bound) { float temp; u16 mantissa; u16 fraction; temp=(float)(pclk2*1000000)/(bound*16); mantissa=temp; fraction=(temp-mantissa)*16; mantissa<<=4; mantissa+=fraction; RCC->AHB1ENR|=1<<0; RCC->APB2ENR|=1<<4; GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU); GPIO_AF_Set(GPIOA,9,7); //PA9,AF7 GPIO_AF_Set(GPIOA,10,7);//PA10,AF7 //²¨ÌØÂÊÉèÖà USART1->BRR=mantissa; USART1->CR1&=~(1<<15); USART1->CR1|=1<<3; #if EN_USART1_RX USART1->CR1|=1<<2; USART1->CR1|=1<<5; MY_NVIC_Init(3,3,USART1_IRQn,2); #endif USART1->CR1|=1<<13; } 由此变简单的实现了STM32向PC机发送数据程序。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1683 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1582 浏览 1 评论
1013 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
703 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1627 浏览 2 评论
1892浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
675浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
538浏览 3评论
558浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
526浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 02:07 , Processed in 0.670401 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号