一、环境介绍
操作系统: win10 64位
QT版本: QT5.12.6
编译器: MinGW 32
串口调试助手,在嵌入式开发中是很常用的。比如: 通过串口打印测试数据、调试串口WIFI(ESP8266、有人WIFI..)、调试GSM模块、GPS模块、字库更新等等。
功能支持:
1. 多条发送(调试ESP288、SIM800C、HC05这些类似模块可以提前把条目编辑好,然后导入)
2. 单条发送
3. 文件发送(可以用来实现字库更新)
4. 协议发送(自定义协议与单片机之间交互)
5. 物联网模拟控制(学习单片机串口的字符串收发)
6. 支持16进制发送
7. 数据保存到文本
8. 支持定时循环发送
软件下载地址: https://download.csdn.net/download/xiaolong1126626497/17044958
项目完整源代码下载: https://download.csdn.net/download/xiaolong1126626497/17058634
二、效果图
三、核心代码
#include "uart_mainwindow.h" #include "ui_uart_mainwindow.h" /* * 设置QT界面的样式 */ void UART_MainWindow::SetStyle(const QString &qssFile) { QFile file(qssFile); if (file.open(QFile::ReadOnly)) { QString qss = QLatin1String(file.readAll()); qApp->setStyleSheet(qss); QString PaletteColor = qss.mid(20,7); qApp->setPalette(QPalette(QColor(PaletteColor))); file.close(); } else { qApp->setStyleSheet(""); } } UART_MainWindow::UART_MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::UART_MainWindow) { ui->setupUi(this); /*1. 页面基本设置*/ this->SetStyle(":/qss/blue.css"); //设置样式表 this->setWindowTitle("嵌入式开发-串口调试助手 v2.0 2020年7月10日"); //设置标题 this->setWindowIcon(QIcon(":/window.ico")); //设置图标 /*2. 多页面切换控件名称设置*/ ui->tabWidget->setTabText(0,"单条发送"); ui->tabWidget->setTabText(1,"多条发送"); ui->tabWidget->setTabText(2,"文件发送"); ui->tabWidget->setTabText(3,"协议发送"); ui->tabWidget->setTabText(4,"物联网模拟控制"); /*3. 默认显示的COM口*/ //刷新串口 on_pushButton_flush_uart_clicked(); /*4. 设置串口默认的配置*/ UART_Config =new QSerialPort; //新建串口对象 UART_Config->setBaudRate(115200); //默认波特率 UART_Config->setDataBits(QSerialPort::Data8); //数据位 UART_Config->setParity(QSerialPort::NoParity);//奇偶校验 UART_Config->setStopBits(QSerialPort::OneStop);//停止位 UART_Config->setFlowControl(QSerialPort::NoFlowControl); //流控开关 connect(UART_Config, SIGNAL(readyRead()),this, SLOT(ReadUasrtData())); //关联读信号 connect(UART_Config, SIGNAL(bytesWritten(qint64)),this, SLOT(WriteDataLen(qint64))); //关联写通道信号(实际向串口里写了多少数据) /*5. 设置数据位选择列表的默认显示参数*/ ui->comboBox_DataBits->addItem("5"); ui->comboBox_DataBits->addItem("6"); ui->comboBox_DataBits->addItem("7"); ui->comboBox_DataBits->addItem("8"); ui->comboBox_DataBits->setCurrentText("8"); //设置当前默认显示的文本 /*6. 设置停止位选择列表的默认显示参数*/ ui->comboBox_StopBit->addItem("1"); ui->comboBox_StopBit->addItem("1.5"); ui->comboBox_StopBit->addItem("2"); ui->comboBox_StopBit->setCurrentText("1"); //设置当前默认显示的文本 /*7.设置奇偶校验位选择列表的默认显示参数*/ ui->comboBox_Parity->addItem("无校验"); ui->comboBox_Parity->addItem("奇校验"); ui->comboBox_Parity->addItem("偶校验"); ui->comboBox_Parity->setCurrentText("无校验"); //设置当前默认显示的文本 ui->plainTextEdit_SendData->setPlainText("https://blog.csdn.net/xiaolong1126626497"); /*8. 定时发送设置*/ UartSendTimer = new QTimer(this); //创建定时器 connect(UartSendTimer, SIGNAL(timeout()), this, SLOT(SendTimeUpdate())); //关联槽函数 ui->spinBox_Time->setValue(1000); //默认周期为1000ms ui->spinBox_Time->setMaximum(9999); //周期最大值 ui->spinBox_Time->setMinimum(0); //周期最小值 /*9. 状态栏*/ StatusWindow = new QWidget; LcdShowTxCnt = new QTextEdit; LcdShowRxCnt = new QTextEdit; LabelShowTx = new QLabel("TX:"); LabelShowRx = new QLabel("RX:"); Statuslayout = new QHBoxLayout; // Statuslayout->addStretch(); Statuslayout->addWidget(LabelShowTx); Statuslayout->addWidget(LcdShowTxCnt); Statuslayout->addWidget(LabelShowRx); Statuslayout->addWidget(LcdShowRxCnt); StatusWindow->setLayout(Statuslayout); // Statuslayout->addStretch(); /*添加状态栏*/ QStatusBar *StatList=statusBar(); StatList->addWidget(StatusWindow); // StatList->setStyleSheet(QString("QStatusBar::item{border: 0px}")); RxCnt=0; //接收数量 TxCnt=0; //发送数量 LcdShowTxCnt->setEnabled(false); LcdShowRxCnt->setEnabled(false); /*10. 构造多条发送的列表*/ LineEditSendList.clear(); //清空列表 LineEditSendList.append(ui->lineEdit_tx_1); LineEditSendList.append(ui->lineEdit_tx_2); LineEditSendList.append(ui->lineEdit_tx_3); LineEditSendList.append(ui->lineEdit_tx_4); LineEditSendList.append(ui->lineEdit_tx_5); LineEditSendList.append(ui->lineEdit_tx_6); LineEditSendList.append(ui->lineEdit_tx_7); LineEditSendList.append(ui->lineEdit_tx_8); LineEditSendList.append(ui->lineEdit_tx_9); LineEditSendList.append(ui->lineEdit_tx_10); LineEditSendList.append(ui->lineEdit_tx_11); LineEditSendList.append(ui->lineEdit_tx_12); /*11. 初始化文件发送相关参数*/ ui->progressBar_SendFileProgress->setMinimum(0); //进度条最小值0 ui->progressBar_SendFileProgress->setValue(0); //设置进度条当前显示的值0 ui->spinBox_OnePackageSendByte->setMinimum(1); //每包发送的字节数最小值 ui->spinBox_OnePackageSendByte->setMaximum(4096); //每包发送的字节数最大值 ui->spinBox_OnePackageSendByte->setValue(100); //当前默认字节数 ui->spinBox_OnePackageSendTime->setMaximum(0); //每包发送的最小间隔时间ms ui->spinBox_OnePackageSendTime->setMaximum(9999); //每包发送的最大间隔时间ms ui->spinBox_OnePackageSendTime->setValue(100); //当前默认间隔时间 FileSendTimer = new QTimer(this); //创建定时器 connect(FileSendTimer, SIGNAL(timeout()), this, SLOT(FileSendTimeUpdate())); //关联槽函数 FileSendStat=0; //文件发送标志 //数据显示页面 ui->plainTextEdit_ShowRxData->setReadOnly(true); //设置日志显示界面为只读 } UART_MainWindow::~UART_MainWindow() { delete ui; delete UART_Config; delete UartSendTimer; delete StatusWindow; delete LcdShowTxCnt; delete LcdShowRxCnt; delete LabelShowTx; delete LabelShowRx; delete Statuslayout; delete FileSendTimer; } //设置选中的波特率 void UART_MainWindow::on_comboBox_BaudSelect_currentTextChanged(const QString &arg1) { UART_Config->setBaudRate(arg1.toInt()); //设置波特率 } //设置选中的停止位 void UART_MainWindow::on_comboBox_StopBit_currentTextChanged(const QString &arg1) { if(arg1=="2") { UART_Config->setStopBits(QSerialPort::TwoStop);//2个停止位 } else if(arg1=="1.5") { UART_Config->setStopBits(QSerialPort::OneAndHalfStop);//1.5个停止位 } else { UART_Config->setStopBits(QSerialPort::OneStop);//1个停止位 } } //设置选中的数据位 void UART_MainWindow::on_comboBox_DataBits_currentTextChanged(const QString &arg1) { if(arg1=="5") { UART_Config->setDataBits(QSerialPort::Data5); //数据5位 } else if(arg1=="6") { UART_Config->setDataBits(QSerialPort::Data6); //数据6位 } else if(arg1=="7") { UART_Config->setDataBits(QSerialPort::Data7); //数据7位 } else { UART_Config->setDataBits(QSerialPort::Data8); //数据8位 } } //设置选中的奇偶校验位 void UART_MainWindow::on_comboBox_Parity_activated(const QString &arg1) { if(arg1=="奇校验") { UART_Config->setParity(QSerialPort::OddParity); //奇校验 } else if(arg1=="偶校验") { UART_Config->setParity(QSerialPort::EvenParity);//偶校验 } else //无校验 { UART_Config->setParity(QSerialPort::NoParity);//无校验 } } //选择硬件流量控制开关 void UART_MainWindow::on_checkBox_RTS_CTS_clicked() { if(ui->checkBox_RTS_CTS->isChecked()) { UART_Config->setFlowControl(QSerialPort::HardwareControl); //硬件流控开关 } else { UART_Config->setFlowControl(QSerialPort::NoFlowControl); //无流控开关 } } //选择软件流量控制开关 void UART_MainWindow::on_checkBox_XON_XOFF_clicked() { if(ui->checkBox_XON_XOFF->isChecked()) { UART_Config->setFlowControl(QSerialPort::SoftwareControl); //软件流控开关 } else { UART_Config->setFlowControl(QSerialPort::NoFlowControl); //无流控开关 } } //打开串口 void UART_MainWindow::on_pushButton_OpenUart_clicked() { if(ui->pushButton_OpenUart->text()=="打开串口") //打开串口 { ui->pushButton_OpenUart->setText("关闭串口"); /*配置串口的信息*/ UART_Config->setPortName(ui->comboBox_ComSelect->currentText()); //COM的名称 if(!(UART_Config->open(QIODevice::ReadWrite))) //打开的属性权限 { QMessageBox::warning(this, tr("串口状态提示"), tr("串口打开失败!\n请选择正确的COM口"), QMessageBox::Ok); ui->pushButton_OpenUart->setText("打开串口"); return; } } else //关闭串口 { ui->pushButton_OpenUart->setText("打开串口"); /*关闭串口-*/ UART_Config->clear(QSerialPort::AllDirections); UART_Config->close(); } } //读信号 void UART_MainWindow::ReadUasrtData() { /*返回可读的字节数*/ if(UART_Config->bytesAvailable()<=0) { return; } //设置光标到文本末尾 ui->plainTextEdit_ShowRxData->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); /*移动滚动条到底部*/ QScrollBar *scrollbar = ui->plainTextEdit_ShowRxData->verticalScrollBar(); if(scrollbar) { scrollbar->setSliderPosition(scrollbar->maximum()); } /*定义字节数组*/ QByteArray rx_data; /*读取串口缓冲区所有的数据*/ rx_data=UART_Config->readAll(); RxCnt+=rx_data.length(); //记录接收长度 LcdShowRxCnt->setText(QString::number(RxCnt)); //显示接收数量 QString Rx_str_data; //显示接收时间 if(ui->checkBox_ShowTime->isChecked()) { QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间 Rx_str_data= time.toString("【yyyy-MM-dd hh:mm:ss ddd"); //设置显示格式 Rx_str_data+="】:"; } if(ui->checkBox_HexShow->isChecked()) { rx_data=rx_data.toHex(); /*显示HEX*/ Rx_str_data+=tr("").fromLocal8Bit(rx_data.data()); } else { /*解决中文乱码*/ Rx_str_data+=tr("").fromLocal8Bit(rx_data.data()); } /*当长度大于5000字节时,自动清空显示*/ if(Rx_str_data.length()>5000) { //ui->plainTextEdit_ShowRxData->setPlainText(""); } /*显示收到的数据--*/ ui->plainTextEdit_ShowRxData->insertPlainText(Rx_str_data); } //清空显示 void UART_MainWindow::on_pushButton_ClearData_clicked() { ui->plainTextEdit_ShowRxData->setPlainText(""); RxCnt=0; LcdShowRxCnt->setText(QString::number(RxCnt)); //显示接收数量 } //发送数据 void UART_MainWindow::UartSendData(QByteArray SendText) { if(UART_Config->isOpen()==false)return; if(SendText.isEmpty()) return; //判断有没有输入数据 TxCnt+=SendText.length(); //记录发送的长度 LcdShowTxCnt->setText(QString::number(TxCnt)); //显示发送数量 //16进制发送 if(ui->checkBox_HexSend->isChecked()) { SendText=SendText.toHex(); } //发送新行 if(ui->checkBox_SendNewLine->isChecked()) { SendText+="\r\n"; } UART_Config->write(SendText); //发送数据 } //发送数据 void UART_MainWindow::on_pushButton_SendData_clicked() { QString text=ui->plainTextEdit_SendData->toPlainText(); UartSendData(text.toLocal8Bit()); } //清除发送 void UART_MainWindow::on_pushButton_ClearSend_clicked() { ui->plainTextEdit_SendData->setPlainText(""); TxCnt=0; LcdShowTxCnt->setText(QString::number(TxCnt)); //显示接收数量 } //链接到指定位置 void UART_MainWindow::on_commandLinkButton_link_clicked() { QDesktopServices::openUrl(QUrl("https://blog.csdn.net/xiaolong1126626497")); } //定时发送 void UART_MainWindow::on_checkBox_Time_Send_clicked() { if(ui->checkBox_Time_Send->isChecked()) //开启定时发送 { int time_cnt=ui->spinBox_Time->value(); if(time_cnt<=0) { ui->checkBox_Time_Send->setChecked(false); //没有选中 QMessageBox::warning(this, tr("定时发送状态提示"), tr("请设置正确的时间!"), QMessageBox::Ok); } else { UartSendTimer->start(time_cnt); //开启定时器 } } else //关闭定时发送 { UartSendTimer->stop(); } } //定时器 超时函数,用于定时发送 void UART_MainWindow::SendTimeUpdate() { on_pushButton_SendData_clicked(); //发送数据 } //保存接收的数据到文件 void UART_MainWindow::on_pushButton_SaveData_clicked() { QString filename=QFileDialog::getSaveFileName(this,"保存串口数据","D:/UatrRxData.txt",tr("*.txt")); if(filename.isEmpty()) { QMessageBox::warning(this, tr("文件保存状态提示"), tr("----------文件名为空!--------------"), QMessageBox::Ok); return; //判断是否为空 } QFile file(filename); if(file.open(QIODevice::WriteOnly|QIODevice::Append)==false) //只写与追加模式 { QMessageBox::warning(this, tr("文件保存状态提示"), tr("-----------------文件创建失败!----------------"), QMessageBox::Ok); return; } QByteArray array=ui->plainTextEdit_ShowRxData->toPlainText().toLocal8Bit(); file.write(array); file.close(); } /* 多条发送处理 */ void UART_MainWindow::on_pushButton_send_1_clicked() { QString text=ui->lineEdit_tx_1->text(); UartSendData(text.toLocal8Bit()); } void UART_MainWindow::on_pushButton_send_2_clicked() { QString text=ui->lineEdit_tx_2->text(); UartSendData(text.toLocal8Bit()); } void UART_MainWindow::on_pushButton_send_3_clicked() { QString text=ui->lineEdit_tx_3->text(); UartSendData(text.toLocal8Bit()); } void UART_MainWindow::on_pushButton_send_4_clicked() { QString text=ui->lineEdit_tx_4->text(); UartSendData(text.toLocal8Bit()); } void UART_MainWindow::on_pushButton_send_5_clicked() { QString text=ui->lineEdit_tx_5->text(); UartSendData(text.toLocal8Bit()); } void UART_MainWindow::on_pushButton_send_6_clicked() { QString text=ui->lineEdit_tx_6->text(); UartSendData(text.toLocal8Bit()); } void UART_MainWindow::on_pushButton_send_7_clicked() { QString text=ui->lineEdit_tx_7->text(); UartSendData(text.toLocal8Bit()); } void UART_MainWindow::on_pushButton_send_8_clicked() { QString text=ui->lineEdit_tx_8->text(); UartSendData(text.toLocal8Bit()); } void UART_MainWindow::on_pushButton_send_9_clicked() { QString text=ui->lineEdit_tx_9->text(); UartSendData(text.toLocal8Bit()); } void UART_MainWindow::on_pushButton_send_10_clicked() { QString text=ui->lineEdit_tx_10->text(); UartSendData(text.toLocal8Bit()); } void UART_MainWindow::on_pushButton_send_11_clicked() { QString text=ui->lineEdit_tx_11->text(); UartSendData(text.toLocal8Bit()); } void UART_MainWindow::on_pushButton_send_12_clicked() { QString text=ui->lineEdit_tx_12->text(); UartSendData(text.toLocal8Bit()); } //导入发送条目 void UART_MainWindow::on_pushButton_SlectSendList_clicked() { QString filename=QFileDialog::getOpenFileName(this,"选择导入的条目文件","esp8266+sta+tcp_server.txt",tr("*.txt")); //filename==选择文件的绝对路径 QFile file(filename); if(file.open(QIODevice::ReadOnly)==false) //只读 { QMessageBox::warning(this, tr("文件状态提示"), tr("-----------------存放条目的文件打开失败!----------------"), QMessageBox::Ok); return; } //导入条目 for(int i=0;i<LineEditSendList.count();i++) { if(file.atEnd()){break;} //文件读取完毕 QByteArray array=file.readLine();//读取一行,以\n结束 LineEditSendList.at(i)->setText(QString(array)); //设置文本编辑器显示 } file.close(); //关闭文件 } //清除条目 void UART_MainWindow::on_pushButton_ClearSendList_clicked() { //清除条目 for(int i=0;i<LineEditSendList.count();i++) { LineEditSendList.at(i)->setText(""); //设置文本编辑器显示 } } //条目创建说明 void UART_MainWindow::on_pushButton_SendListExplain_clicked() { QMessageBox::warning(this, tr("条目编辑说明"), tr("1. 存放条目的文件需要以xxx.txt结尾(就是普通文本文件)\n" "2. 文本文件里每一行的条目数据需要以\\n结束\n" "(也就是说,编辑一行数据就按回车,在第二行再继续编辑)\n" "3. 条目最大只能存放12行数据,多出的数据不会导入!"), QMessageBox::Ok); } //选择发送的文件 void UART_MainWindow::on_pushButton_SelectSendFile_clicked() { QString filename=QFileDialog::getOpenFileName(this,"选择发送的文件","D:/",tr("*.*")); //filename==选择文件的绝对路径 if(filename.isEmpty()) { QMessageBox::warning(this, tr("文件状态提示"), tr("路径为空,请选择正确的路径!"), QMessageBox::Ok); ui->lineEdit_SendFileAddr->setText(""); //清除数据 } ui->lineEdit_SendFileAddr->setText(filename); //设置要发送的文件路径 } //开始发送文件 void UART_MainWindow::on_pushButton_StartSendFile_clicked() { if(UART_Config->isOpen()==false) { QMessageBox::warning(this, tr("状态提示"), tr("请先打开串口,在继续操作!"), QMessageBox::Ok); return; } QString filename=ui->lineEdit_SendFileAddr->text(); //获取文件路径 SendFile.setFileName(filename); //设置发送的文件路径 SendFile.close(); //先关闭再打开 if(SendFile.open(QIODevice::ReadOnly)==false) //只读 { QMessageBox::warning(this, tr("文件状态提示"), tr("文件打开失败,请选择正确的路径!"), QMessageBox::Ok); ui->lineEdit_SendFileAddr->setText(""); //清除数据 return; } ui->label_All_Byete->setText(tr("总字节数:%1").arg(SendFile.size())); ui->progressBar_SendFileProgress->setMaximum(SendFile.size()); //设置进度条最大值 ui->progressBar_SendFileProgress->setValue(0); //进度条清0 FileSendCnt=0; //清除文件发送的字节数 TxCnt=0; //清除发送的字节数 FileSendTimer->start(ui->spinBox_OnePackageSendTime->value()); //设置定时器超时时间 FileSendStat=1; //开始发送标志 UartSendTimer->stop(); //停止循环发送的定时器,防止干扰计数 ui->tabWidget->setTabEnabled(0,false); //设置指定页面失能 ui->tabWidget->setTabEnabled(1,false); //设置指定页面失能 ui->tabWidget->setTabEnabled(3,false); //设置指定页面失能 ui->tabWidget->setTabEnabled(4,false); //设置指定页面失能 } //文件发送帮助提示 void UART_MainWindow::on_pushButton_SendFileHelp_clicked() { QMessageBox::warning(this, tr("文件发送帮助"), tr("为了方便下位机接收文件数据,文件将进行分包发送\n" "每一包的字节大小可以自行设置,范围(1~4096字节)\n" "每一包数据发送的时间间隔也可以自行设置,范围(1~9999ms)\n" "注意: 每包的字节数量和间隔时间只有在开始发送文件之前设置有效!\n"), QMessageBox::Ok); } //停止文件发送 void UART_MainWindow::on_pushButton_StopSendFile_clicked() { FileSendTimer->stop(); //停止定时器 FileSendStat=0; //清除标志 ui->tabWidget->setTabEnabled(0,true); //设置指定页面使能 ui->tabWidget->setTabEnabled(1,true); //设置指定页面使能 ui->tabWidget->setTabEnabled(3,true); //设置指定页面使能 ui->tabWidget->setTabEnabled(4,true); //设置指定页面使能 } //开始文件发送 void UART_MainWindow::FileSendTimeUpdate() { int sen_len=ui->spinBox_OnePackageSendByte->value(); //每次发送的长度 int cnt=SendFile.read(FileSendBuff,sen_len); QByteArray array(FileSendBuff,cnt); //构造数组 UartSendData(array); //发送数据 if(cnt!=sen_len) { FileSendTimer->stop(); //停止定时器 } //可以增加优化代码,等待发送完毕 } //实际发送成功的数据 void UART_MainWindow::WriteDataLen(qint64 cnt) { if(FileSendStat) { FileSendCnt+=cnt; ui->progressBar_SendFileProgress->setValue(FileSendCnt); //更新进度条 if(FileSendCnt==SendFile.size()) //判断是否发送完毕 { QMessageBox::warning(this, tr("文件发送状态"), tr("----文件发送成功!----"), QMessageBox::Ok); FileSendStat=0; //清除标志 SendFile.close(); //关闭文件 ui->tabWidget->setTabEnabled(0,true); //设置指定页面使能 ui->tabWidget->setTabEnabled(1,true); //设置指定页面使能 ui->tabWidget->setTabEnabled(3,true); //设置指定页面使能 ui->tabWidget->setTabEnabled(4,true); //设置指定页面使能 } } } //模拟物联网控制_LED1 void UART_MainWindow::on_pushButton_LED1_clicked() { if(UART_Config->isOpen()==false)return; static bool state=1; if(state) //开启LED { UartSendData( QByteArray("LED1_ON")); ui->pushButton_LED1->setText("关闭LED1"); } else { UartSendData( QByteArray("LED1_OFF")); ui->pushButton_LED1->setText("开启LED1"); } state=!state; } //模拟物联网控制_LED2 void UART_MainWindow::on_pushButton_LED2_clicked() { if(UART_Config->isOpen()==false)return; static bool state=1; if(state) //开启LED { UartSendData( QByteArray("LED2_ON")); ui->pushButton_LED2->setText("关闭LED2"); } else { UartSendData( QByteArray("LED2_OFF")); ui->pushButton_LED2->setText("开启LED2"); } state=!state; } //模拟物联网控制_LED3 void UART_MainWindow::on_pushButton_LED3_clicked() { if(UART_Config->isOpen()==false)return; static bool state=1; if(state) //开启LED { UartSendData( QByteArray("LED3_ON")); ui->pushButton_LED3->setText("关闭LED3"); } else { UartSendData( QByteArray("LED3_OFF")); ui->pushButton_LED3->setText("开启LED3"); } state=!state; } //模拟物联网控制_LED4 void UART_MainWindow::on_pushButton_LED4_clicked() { if(UART_Config->isOpen()==false)return; static bool state=1; if(state) //开启LED { UartSendData( QByteArray("LED4_ON")); ui->pushButton_LED4->setText("关闭LED4"); } else { UartSendData( QByteArray("LED4_OFF")); ui->pushButton_LED4->setText("开启LED4"); } state=!state; } //模拟物联网控制_BEEP void UART_MainWindow::on_pushButton_BEEP_clicked() { if(UART_Config->isOpen()==false)return; static bool state=1; if(state) //开启LED { UartSendData( QByteArray("BEEP_ON")); ui->pushButton_BEEP->setText("关闭BEEP"); } else { UartSendData( QByteArray("BEEP_OFF")); ui->pushButton_BEEP->setText("开启BEEP"); } state=!state; } //模拟物联网控制_RTC时间校准 void UART_MainWindow::on_pushButton_RTC_Time_clicked() { QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间 QString str1="按照本地时间进行校准:\n"; str1+=time.toString("yyyy-MM-dd hh:mm:ss ddd\n"); //设置显示格式 //获取本地时间校准物联网开发板RTC时间 QString str2="*"; //加上标识符进行区分 str2+=time.toString("yyyyMMddhhmmss"); //设置显示格式 str1+="串口发出的数据:"; str1+=str2; QMessageBox::about(this,"校准RTC时间",str1); QByteArray text=str2.toLocal8Bit(); UartSendData(text); //发送数据 } //帮助信息提示 void UART_MainWindow::on_action_help_info_triggered() { QMessageBox::about(this,"关于","软件用于串口调试,支持基本数据收发,支持文件发送\n" "支持模拟物联网控制\n" "软件作者:DS小龙哥\n" "BUG反馈:1126626497@qq.com"); } void UART_MainWindow::on_pushButton_flush_uart_clicked() { QList<QSerialPortInfo> UartInfoList=QSerialPortInfo::availablePorts(); //获取可用串口端口信息 ui->comboBox_ComSelect->clear(); if(UartInfoList.count()>0) { for(int i=0;i<UartInfoList.count();i++) { if(UartInfoList.at(i).isBusy()) //如果当前串口 COM 口忙就返回真,否则返回假 { QString info=UartInfoList.at(i).portName(); info+="(占用)"; ui->comboBox_ComSelect->addItem(info); //添加新的条目选项 } else { ui->comboBox_ComSelect->addItem(UartInfoList.at(i).portName()); //添加新的条目选项 } } } else { ui->comboBox_ComSelect->addItem("无可用串口"); //添加新的条目选项 } }
3.2 widget.h代码
#ifndef UART_MAINWINDOW_H #define UART_MAINWINDOW_H #include <QMainWindow> #include <QFile> #include <QSerialPortInfo> #include <QSerialPort> #include <QDebug> #include <QMessageBox> #include <QDateTime> #include <QScrollBar> #include <QDesktopServices> #include <Qtimer> #include <QFileDialog> #include <QTextEdit> #include <QHBoxLayout> #include <QLineEdit> #include <QThread> namespace Ui { class UART_MainWindow; } class UART_MainWindow : public QMainWindow { Q_OBJECT public: explicit UART_MainWindow(QWidget *parent = 0); ~UART_MainWindow(); void SetStyle(const QString &qssFile); //样式表设置函数 void UartSendData(QByteArray SendText); QSerialPortInfo *UART_Info; QSerialPort *UART_Config; //串口 QTimer *UartSendTimer; QTimer *FileSendTimer; /*状态栏*/ QWidget *StatusWindow; QTextEdit *LcdShowTxCnt; QTextEdit *LcdShowRxCnt; QLabel *LabelShowTx; QLabel *LabelShowRx; QHBoxLayout *Statuslayout; int RxCnt; //接收数量 int TxCnt; //发送数量 QList<QLineEdit*> LineEditSendList; //构造多条发送的列表 QFile SendFile; //发送的文件 char FileSendBuff[4096]; //最大发送数量 int FileSendCnt; //记录文件发送字节数 bool FileSendStat; //文件发送状态 private slots: void FileSendTimeUpdate(); void WriteDataLen(qint64); //实际发送的数据通知 void on_comboBox_BaudSelect_currentTextChanged(const QString &arg1); void on_comboBox_StopBit_currentTextChanged(const QString &arg1); void on_comboBox_DataBits_currentTextChanged(const QString &arg1); void on_comboBox_Parity_activated(const QString &arg1); void on_checkBox_RTS_CTS_clicked(); void on_checkBox_XON_XOFF_clicked(); void on_pushButton_OpenUart_clicked(); void ReadUasrtData(); void on_pushButton_ClearData_clicked(); void on_pushButton_SendData_clicked(); void on_pushButton_ClearSend_clicked(); void on_commandLinkButton_link_clicked(); void on_checkBox_Time_Send_clicked(); void SendTimeUpdate(); void on_pushButton_SaveData_clicked(); void on_pushButton_send_1_clicked(); void on_pushButton_send_2_clicked(); void on_pushButton_send_3_clicked(); void on_pushButton_send_4_clicked(); void on_pushButton_send_5_clicked(); void on_pushButton_send_6_clicked(); void on_pushButton_send_7_clicked(); void on_pushButton_send_8_clicked(); void on_pushButton_send_9_clicked(); void on_pushButton_send_10_clicked(); void on_pushButton_send_11_clicked(); void on_pushButton_send_12_clicked(); void on_pushButton_SlectSendList_clicked(); void on_pushButton_ClearSendList_clicked(); void on_pushButton_SendListExplain_clicked(); void on_pushButton_SelectSendFile_clicked(); void on_pushButton_StartSendFile_clicked(); void on_pushButton_SendFileHelp_clicked(); void on_pushButton_StopSendFile_clicked(); void on_pushButton_LED1_clicked(); void on_pushButton_LED2_clicked(); void on_pushButton_LED3_clicked(); void on_pushButton_LED4_clicked(); void on_pushButton_BEEP_clicked(); void on_pushButton_RTC_Time_clicked(); void on_action_help_info_triggered(); void on_pushButton_flush_uart_clicked(); private: Ui::UART_MainWindow *ui; }; #endif // UART_MAINWINDOW_H
3.3 UI设计界面