飞道的博客

QT应用编程: 开发串口调试助手

266人阅读  评论(0)

一、环境介绍

操作系统: win10 64位

QT版本:  QT5.12.6

编译器:  MinGW 32

串口调试助手,在嵌入式开发中是很常用的。比如:  通过串口打印测试数据、调试串口WIFI(ESP8266、有人WIFI..)、调试GSM模块、GPS模块、字库更新等等。

这个版本写的比较早,没有使用多线程处理串口数据,但是对于一般的串口开发学习借鉴,串口的基本应用已经足够了。

软件下载地址:  https://download.csdn.net/download/xiaolong1126626497/17044958  

项目完整源代码下载: https://download.csdn.net/download/xiaolong1126626497/17058634

二、效果图

三、核心代码

3.1  widget.cpp


  
  1. #include "uart_mainwindow.h"
  2. #include "ui_uart_mainwindow.h"
  3. /*
  4. * 设置QT界面的样式
  5. */
  6. void UART_MainWindow::SetStyle(const QString &qssFile) {
  7. QFile file(qssFile);
  8. if (file.open(QFile::ReadOnly)) {
  9. QString qss = QLatin1String(file.readAll());
  10. qApp->setStyleSheet(qss);
  11. QString PaletteColor = qss.mid( 20, 7);
  12. qApp->setPalette(QPalette(QColor(PaletteColor)));
  13. file.close();
  14. }
  15. else
  16. {
  17. qApp->setStyleSheet( "");
  18. }
  19. }
  20. UART_MainWindow::UART_MainWindow(QWidget *parent) :
  21. QMainWindow(parent),
  22. ui( new Ui::UART_MainWindow)
  23. {
  24. ui->setupUi( this);
  25. /*1. 页面基本设置*/
  26. this->SetStyle( ":/qss/blue.css"); //设置样式表
  27. this->setWindowTitle( "嵌入式开发-串口调试助手 v2.0 2020年7月10日"); //设置标题
  28. this->setWindowIcon(QIcon( ":/window.ico")); //设置图标
  29. /*2. 多页面切换控件名称设置*/
  30. ui->tabWidget->setTabText( 0, "单条发送");
  31. ui->tabWidget->setTabText( 1, "多条发送");
  32. ui->tabWidget->setTabText( 2, "文件发送");
  33. ui->tabWidget->setTabText( 3, "协议发送");
  34. ui->tabWidget->setTabText( 4, "物联网模拟控制");
  35. /*3. 默认显示的COM口*/
  36. //刷新串口
  37. on_pushButton_flush_uart_clicked();
  38. /*4. 设置串口默认的配置*/
  39. UART_Config = new QSerialPort; //新建串口对象
  40. UART_Config->setBaudRate( 115200); //默认波特率
  41. UART_Config->setDataBits(QSerialPort::Data8); //数据位
  42. UART_Config->setParity(QSerialPort::NoParity); //奇偶校验
  43. UART_Config->setStopBits(QSerialPort::OneStop); //停止位
  44. UART_Config->setFlowControl(QSerialPort::NoFlowControl); //流控开关
  45. connect(UART_Config, SIGNAL(readyRead()), this, SLOT(ReadUasrtData())); //关联读信号
  46. connect(UART_Config, SIGNAL(bytesWritten(qint64)), this, SLOT(WriteDataLen(qint64))); //关联写通道信号(实际向串口里写了多少数据)
  47. /*5. 设置数据位选择列表的默认显示参数*/
  48. ui->comboBox_DataBits->addItem( "5");
  49. ui->comboBox_DataBits->addItem( "6");
  50. ui->comboBox_DataBits->addItem( "7");
  51. ui->comboBox_DataBits->addItem( "8");
  52. ui->comboBox_DataBits->setCurrentText( "8"); //设置当前默认显示的文本
  53. /*6. 设置停止位选择列表的默认显示参数*/
  54. ui->comboBox_StopBit->addItem( "1");
  55. ui->comboBox_StopBit->addItem( "1.5");
  56. ui->comboBox_StopBit->addItem( "2");
  57. ui->comboBox_StopBit->setCurrentText( "1"); //设置当前默认显示的文本
  58. /*7.设置奇偶校验位选择列表的默认显示参数*/
  59. ui->comboBox_Parity->addItem( "无校验");
  60. ui->comboBox_Parity->addItem( "奇校验");
  61. ui->comboBox_Parity->addItem( "偶校验");
  62. ui->comboBox_Parity->setCurrentText( "无校验"); //设置当前默认显示的文本
  63. ui->plainTextEdit_SendData->setPlainText( "https://blog.csdn.net/xiaolong1126626497");
  64. /*8. 定时发送设置*/
  65. UartSendTimer = new QTimer( this); //创建定时器
  66. connect(UartSendTimer, SIGNAL(timeout()), this, SLOT(SendTimeUpdate())); //关联槽函数
  67. ui->spinBox_Time->setValue( 1000); //默认周期为1000ms
  68. ui->spinBox_Time->setMaximum( 9999); //周期最大值
  69. ui->spinBox_Time->setMinimum( 0); //周期最小值
  70. /*9. 状态栏*/
  71. StatusWindow = new QWidget;
  72. LcdShowTxCnt = new QTextEdit;
  73. LcdShowRxCnt = new QTextEdit;
  74. LabelShowTx = new QLabel( "TX:");
  75. LabelShowRx = new QLabel( "RX:");
  76. Statuslayout = new QHBoxLayout;
  77. // Statuslayout->addStretch();
  78. Statuslayout->addWidget(LabelShowTx);
  79. Statuslayout->addWidget(LcdShowTxCnt);
  80. Statuslayout->addWidget(LabelShowRx);
  81. Statuslayout->addWidget(LcdShowRxCnt);
  82. StatusWindow->setLayout(Statuslayout);
  83. // Statuslayout->addStretch();
  84. /*添加状态栏*/
  85. QStatusBar *StatList=statusBar();
  86. StatList->addWidget(StatusWindow);
  87. // StatList->setStyleSheet(QString("QStatusBar::item{border: 0px}"));
  88. RxCnt= 0; //接收数量
  89. TxCnt= 0; //发送数量
  90. LcdShowTxCnt->setEnabled( false);
  91. LcdShowRxCnt->setEnabled( false);
  92. /*10. 构造多条发送的列表*/
  93. LineEditSendList.clear(); //清空列表
  94. LineEditSendList.append(ui->lineEdit_tx_1);
  95. LineEditSendList.append(ui->lineEdit_tx_2);
  96. LineEditSendList.append(ui->lineEdit_tx_3);
  97. LineEditSendList.append(ui->lineEdit_tx_4);
  98. LineEditSendList.append(ui->lineEdit_tx_5);
  99. LineEditSendList.append(ui->lineEdit_tx_6);
  100. LineEditSendList.append(ui->lineEdit_tx_7);
  101. LineEditSendList.append(ui->lineEdit_tx_8);
  102. LineEditSendList.append(ui->lineEdit_tx_9);
  103. LineEditSendList.append(ui->lineEdit_tx_10);
  104. LineEditSendList.append(ui->lineEdit_tx_11);
  105. LineEditSendList.append(ui->lineEdit_tx_12);
  106. /*11. 初始化文件发送相关参数*/
  107. ui->progressBar_SendFileProgress->setMinimum( 0); //进度条最小值0
  108. ui->progressBar_SendFileProgress->setValue( 0); //设置进度条当前显示的值0
  109. ui->spinBox_OnePackageSendByte->setMinimum( 1); //每包发送的字节数最小值
  110. ui->spinBox_OnePackageSendByte->setMaximum( 4096); //每包发送的字节数最大值
  111. ui->spinBox_OnePackageSendByte->setValue( 100); //当前默认字节数
  112. ui->spinBox_OnePackageSendTime->setMaximum( 0); //每包发送的最小间隔时间ms
  113. ui->spinBox_OnePackageSendTime->setMaximum( 9999); //每包发送的最大间隔时间ms
  114. ui->spinBox_OnePackageSendTime->setValue( 100); //当前默认间隔时间
  115. FileSendTimer = new QTimer( this); //创建定时器
  116. connect(FileSendTimer, SIGNAL(timeout()), this, SLOT(FileSendTimeUpdate())); //关联槽函数
  117. FileSendStat= 0; //文件发送标志
  118. //数据显示页面
  119. ui->plainTextEdit_ShowRxData->setReadOnly( true); //设置日志显示界面为只读
  120. }
  121. UART_MainWindow::~UART_MainWindow()
  122. {
  123. delete ui;
  124. delete UART_Config;
  125. delete UartSendTimer;
  126. delete StatusWindow;
  127. delete LcdShowTxCnt;
  128. delete LcdShowRxCnt;
  129. delete LabelShowTx;
  130. delete LabelShowRx;
  131. delete Statuslayout;
  132. delete FileSendTimer;
  133. }
  134. //设置选中的波特率
  135. void UART_MainWindow::on_comboBox_BaudSelect_currentTextChanged(const QString &arg1)
  136. {
  137. UART_Config->setBaudRate(arg1.toInt()); //设置波特率
  138. }
  139. //设置选中的停止位
  140. void UART_MainWindow::on_comboBox_StopBit_currentTextChanged(const QString &arg1)
  141. {
  142. if(arg1== "2")
  143. {
  144. UART_Config->setStopBits(QSerialPort::TwoStop); //2个停止位
  145. }
  146. else if(arg1== "1.5")
  147. {
  148. UART_Config->setStopBits(QSerialPort::OneAndHalfStop); //1.5个停止位
  149. }
  150. else
  151. {
  152. UART_Config->setStopBits(QSerialPort::OneStop); //1个停止位
  153. }
  154. }
  155. //设置选中的数据位
  156. void UART_MainWindow::on_comboBox_DataBits_currentTextChanged(const QString &arg1)
  157. {
  158. if(arg1== "5")
  159. {
  160. UART_Config->setDataBits(QSerialPort::Data5); //数据5位
  161. }
  162. else if(arg1== "6")
  163. {
  164. UART_Config->setDataBits(QSerialPort::Data6); //数据6位
  165. }
  166. else if(arg1== "7")
  167. {
  168. UART_Config->setDataBits(QSerialPort::Data7); //数据7位
  169. }
  170. else
  171. {
  172. UART_Config->setDataBits(QSerialPort::Data8); //数据8位
  173. }
  174. }
  175. //设置选中的奇偶校验位
  176. void UART_MainWindow::on_comboBox_Parity_activated(const QString &arg1)
  177. {
  178. if(arg1== "奇校验")
  179. {
  180. UART_Config->setParity(QSerialPort::OddParity); //奇校验
  181. }
  182. else if(arg1== "偶校验")
  183. {
  184. UART_Config->setParity(QSerialPort::EvenParity); //偶校验
  185. }
  186. else //无校验
  187. {
  188. UART_Config->setParity(QSerialPort::NoParity); //无校验
  189. }
  190. }
  191. //选择硬件流量控制开关
  192. void UART_MainWindow::on_checkBox_RTS_CTS_clicked()
  193. {
  194. if(ui->checkBox_RTS_CTS->isChecked())
  195. {
  196. UART_Config->setFlowControl(QSerialPort::HardwareControl); //硬件流控开关
  197. }
  198. else
  199. {
  200. UART_Config->setFlowControl(QSerialPort::NoFlowControl); //无流控开关
  201. }
  202. }
  203. //选择软件流量控制开关
  204. void UART_MainWindow::on_checkBox_XON_XOFF_clicked()
  205. {
  206. if(ui->checkBox_XON_XOFF->isChecked())
  207. {
  208. UART_Config->setFlowControl(QSerialPort::SoftwareControl); //软件流控开关
  209. }
  210. else
  211. {
  212. UART_Config->setFlowControl(QSerialPort::NoFlowControl); //无流控开关
  213. }
  214. }
  215. //打开串口
  216. void UART_MainWindow::on_pushButton_OpenUart_clicked()
  217. {
  218. if(ui->pushButton_OpenUart->text()== "打开串口") //打开串口
  219. {
  220. ui->pushButton_OpenUart->setText( "关闭串口");
  221. /*配置串口的信息*/
  222. UART_Config->setPortName(ui->comboBox_ComSelect->currentText()); //COM的名称
  223. if(!(UART_Config->open(QIODevice::ReadWrite))) //打开的属性权限
  224. {
  225. QMessageBox::warning( this, tr( "串口状态提示"),
  226. tr( "串口打开失败!\n请选择正确的COM口"),
  227. QMessageBox::Ok);
  228. ui->pushButton_OpenUart->setText( "打开串口");
  229. return;
  230. }
  231. }
  232. else //关闭串口
  233. {
  234. ui->pushButton_OpenUart->setText( "打开串口");
  235. /*关闭串口-*/
  236. UART_Config->clear(QSerialPort::AllDirections);
  237. UART_Config->close();
  238. }
  239. }
  240. //读信号
  241. void UART_MainWindow::ReadUasrtData()
  242. {
  243. /*返回可读的字节数*/
  244. if(UART_Config->bytesAvailable()<= 0)
  245. {
  246. return;
  247. }
  248. //设置光标到文本末尾
  249. ui->plainTextEdit_ShowRxData->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
  250. /*移动滚动条到底部*/
  251. QScrollBar *scrollbar = ui->plainTextEdit_ShowRxData->verticalScrollBar();
  252. if(scrollbar)
  253. {
  254. scrollbar->setSliderPosition(scrollbar->maximum());
  255. }
  256. /*定义字节数组*/
  257. QByteArray rx_data;
  258. /*读取串口缓冲区所有的数据*/
  259. rx_data=UART_Config->readAll();
  260. RxCnt+=rx_data.length(); //记录接收长度
  261. LcdShowRxCnt->setText(QString::number(RxCnt)); //显示接收数量
  262. QString Rx_str_data;
  263. //显示接收时间
  264. if(ui->checkBox_ShowTime->isChecked())
  265. {
  266. QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间
  267. Rx_str_data= time.toString( "【yyyy-MM-dd hh:mm:ss ddd"); //设置显示格式
  268. Rx_str_data+= "】:";
  269. }
  270. if(ui->checkBox_HexShow->isChecked())
  271. {
  272. rx_data=rx_data.toHex();
  273. /*显示HEX*/
  274. Rx_str_data+=tr( "").fromLocal8Bit(rx_data.data());
  275. }
  276. else
  277. {
  278. /*解决中文乱码*/
  279. Rx_str_data+=tr( "").fromLocal8Bit(rx_data.data());
  280. }
  281. /*当长度大于5000字节时,自动清空显示*/
  282. if(Rx_str_data.length()> 5000)
  283. {
  284. //ui->plainTextEdit_ShowRxData->setPlainText("");
  285. }
  286. /*显示收到的数据--*/
  287. ui->plainTextEdit_ShowRxData->insertPlainText(Rx_str_data);
  288. }
  289. //清空显示
  290. void UART_MainWindow::on_pushButton_ClearData_clicked()
  291. {
  292. ui->plainTextEdit_ShowRxData->setPlainText( "");
  293. RxCnt= 0;
  294. LcdShowRxCnt->setText(QString::number(RxCnt)); //显示接收数量
  295. }
  296. //发送数据
  297. void UART_MainWindow::UartSendData(QByteArray SendText)
  298. {
  299. if(UART_Config->isOpen()== false) return;
  300. if(SendText.isEmpty()) return; //判断有没有输入数据
  301. TxCnt+=SendText.length(); //记录发送的长度
  302. LcdShowTxCnt->setText(QString::number(TxCnt)); //显示发送数量
  303. //16进制发送
  304. if(ui->checkBox_HexSend->isChecked())
  305. {
  306. SendText=SendText.toHex();
  307. }
  308. //发送新行
  309. if(ui->checkBox_SendNewLine->isChecked())
  310. {
  311. SendText+= "\r\n";
  312. }
  313. UART_Config->write(SendText); //发送数据
  314. }
  315. //发送数据
  316. void UART_MainWindow::on_pushButton_SendData_clicked()
  317. {
  318. QString text=ui->plainTextEdit_SendData->toPlainText();
  319. UartSendData(text.toLocal8Bit());
  320. }
  321. //清除发送
  322. void UART_MainWindow::on_pushButton_ClearSend_clicked()
  323. {
  324. ui->plainTextEdit_SendData->setPlainText( "");
  325. TxCnt= 0;
  326. LcdShowTxCnt->setText(QString::number(TxCnt)); //显示接收数量
  327. }
  328. //链接到指定位置
  329. void UART_MainWindow::on_commandLinkButton_link_clicked()
  330. {
  331. QDesktopServices::openUrl(QUrl( "https://blog.csdn.net/xiaolong1126626497"));
  332. }
  333. //定时发送
  334. void UART_MainWindow::on_checkBox_Time_Send_clicked()
  335. {
  336. if(ui->checkBox_Time_Send->isChecked()) //开启定时发送
  337. {
  338. int time_cnt=ui->spinBox_Time->value();
  339. if(time_cnt<= 0)
  340. {
  341. ui->checkBox_Time_Send->setChecked( false); //没有选中
  342. QMessageBox::warning( this, tr( "定时发送状态提示"),
  343. tr( "请设置正确的时间!"),
  344. QMessageBox::Ok);
  345. }
  346. else
  347. {
  348. UartSendTimer->start(time_cnt); //开启定时器
  349. }
  350. }
  351. else //关闭定时发送
  352. {
  353. UartSendTimer->stop();
  354. }
  355. }
  356. //定时器 超时函数,用于定时发送
  357. void UART_MainWindow::SendTimeUpdate()
  358. {
  359. on_pushButton_SendData_clicked(); //发送数据
  360. }
  361. //保存接收的数据到文件
  362. void UART_MainWindow::on_pushButton_SaveData_clicked()
  363. {
  364. QString filename=QFileDialog::getSaveFileName( this, "保存串口数据", "D:/UatrRxData.txt",tr( "*.txt"));
  365. if(filename.isEmpty())
  366. {
  367. QMessageBox::warning( this, tr( "文件保存状态提示"),
  368. tr( "----------文件名为空!--------------"),
  369. QMessageBox::Ok);
  370. return; //判断是否为空
  371. }
  372. QFile file(filename);
  373. if(file.open(QIODevice::WriteOnly|QIODevice::Append)== false) //只写与追加模式
  374. {
  375. QMessageBox::warning( this, tr( "文件保存状态提示"),
  376. tr( "-----------------文件创建失败!----------------"),
  377. QMessageBox::Ok);
  378. return;
  379. }
  380. QByteArray array=ui->plainTextEdit_ShowRxData->toPlainText().toLocal8Bit();
  381. file.write( array);
  382. file.close();
  383. }
  384. /*
  385. 多条发送处理
  386. */
  387. void UART_MainWindow::on_pushButton_send_1_clicked()
  388. {
  389. QString text=ui->lineEdit_tx_1->text();
  390. UartSendData(text.toLocal8Bit());
  391. }
  392. void UART_MainWindow::on_pushButton_send_2_clicked()
  393. {
  394. QString text=ui->lineEdit_tx_2->text();
  395. UartSendData(text.toLocal8Bit());
  396. }
  397. void UART_MainWindow::on_pushButton_send_3_clicked()
  398. {
  399. QString text=ui->lineEdit_tx_3->text();
  400. UartSendData(text.toLocal8Bit());
  401. }
  402. void UART_MainWindow::on_pushButton_send_4_clicked()
  403. {
  404. QString text=ui->lineEdit_tx_4->text();
  405. UartSendData(text.toLocal8Bit());
  406. }
  407. void UART_MainWindow::on_pushButton_send_5_clicked()
  408. {
  409. QString text=ui->lineEdit_tx_5->text();
  410. UartSendData(text.toLocal8Bit());
  411. }
  412. void UART_MainWindow::on_pushButton_send_6_clicked()
  413. {
  414. QString text=ui->lineEdit_tx_6->text();
  415. UartSendData(text.toLocal8Bit());
  416. }
  417. void UART_MainWindow::on_pushButton_send_7_clicked()
  418. {
  419. QString text=ui->lineEdit_tx_7->text();
  420. UartSendData(text.toLocal8Bit());
  421. }
  422. void UART_MainWindow::on_pushButton_send_8_clicked()
  423. {
  424. QString text=ui->lineEdit_tx_8->text();
  425. UartSendData(text.toLocal8Bit());
  426. }
  427. void UART_MainWindow::on_pushButton_send_9_clicked()
  428. {
  429. QString text=ui->lineEdit_tx_9->text();
  430. UartSendData(text.toLocal8Bit());
  431. }
  432. void UART_MainWindow::on_pushButton_send_10_clicked()
  433. {
  434. QString text=ui->lineEdit_tx_10->text();
  435. UartSendData(text.toLocal8Bit());
  436. }
  437. void UART_MainWindow::on_pushButton_send_11_clicked()
  438. {
  439. QString text=ui->lineEdit_tx_11->text();
  440. UartSendData(text.toLocal8Bit());
  441. }
  442. void UART_MainWindow::on_pushButton_send_12_clicked()
  443. {
  444. QString text=ui->lineEdit_tx_12->text();
  445. UartSendData(text.toLocal8Bit());
  446. }
  447. //导入发送条目
  448. void UART_MainWindow::on_pushButton_SlectSendList_clicked()
  449. {
  450. QString filename=QFileDialog::getOpenFileName( this, "选择导入的条目文件", "esp8266+sta+tcp_server.txt",tr( "*.txt"));
  451. //filename==选择文件的绝对路径
  452. QFile file(filename);
  453. if(file.open(QIODevice::ReadOnly)== false) //只读
  454. {
  455. QMessageBox::warning( this, tr( "文件状态提示"),
  456. tr( "-----------------存放条目的文件打开失败!----------------"),
  457. QMessageBox::Ok);
  458. return;
  459. }
  460. //导入条目
  461. for( int i= 0;i<LineEditSendList.count();i++)
  462. {
  463. if(file.atEnd()){ break;} //文件读取完毕
  464. QByteArray array=file.readLine(); //读取一行,以\n结束
  465. LineEditSendList.at(i)->setText(QString( array)); //设置文本编辑器显示
  466. }
  467. file.close(); //关闭文件
  468. }
  469. //清除条目
  470. void UART_MainWindow::on_pushButton_ClearSendList_clicked()
  471. {
  472. //清除条目
  473. for( int i= 0;i<LineEditSendList.count();i++)
  474. {
  475. LineEditSendList.at(i)->setText( ""); //设置文本编辑器显示
  476. }
  477. }
  478. //条目创建说明
  479. void UART_MainWindow::on_pushButton_SendListExplain_clicked()
  480. {
  481. QMessageBox::warning( this, tr( "条目编辑说明"),
  482. tr( "1. 存放条目的文件需要以xxx.txt结尾(就是普通文本文件)\n"
  483. "2. 文本文件里每一行的条目数据需要以\\n结束\n"
  484. "(也就是说,编辑一行数据就按回车,在第二行再继续编辑)\n"
  485. "3. 条目最大只能存放12行数据,多出的数据不会导入!"),
  486. QMessageBox::Ok);
  487. }
  488. //选择发送的文件
  489. void UART_MainWindow::on_pushButton_SelectSendFile_clicked()
  490. {
  491. QString filename=QFileDialog::getOpenFileName( this, "选择发送的文件", "D:/",tr( "*.*"));
  492. //filename==选择文件的绝对路径
  493. if(filename.isEmpty())
  494. {
  495. QMessageBox::warning( this, tr( "文件状态提示"),
  496. tr( "路径为空,请选择正确的路径!"),
  497. QMessageBox::Ok);
  498. ui->lineEdit_SendFileAddr->setText( ""); //清除数据
  499. }
  500. ui->lineEdit_SendFileAddr->setText(filename); //设置要发送的文件路径
  501. }
  502. //开始发送文件
  503. void UART_MainWindow::on_pushButton_StartSendFile_clicked()
  504. {
  505. if(UART_Config->isOpen()== false)
  506. {
  507. QMessageBox::warning( this, tr( "状态提示"),
  508. tr( "请先打开串口,在继续操作!"),
  509. QMessageBox::Ok);
  510. return;
  511. }
  512. QString filename=ui->lineEdit_SendFileAddr->text(); //获取文件路径
  513. SendFile.setFileName(filename); //设置发送的文件路径
  514. SendFile.close(); //先关闭再打开
  515. if(SendFile.open(QIODevice::ReadOnly)== false) //只读
  516. {
  517. QMessageBox::warning( this, tr( "文件状态提示"),
  518. tr( "文件打开失败,请选择正确的路径!"),
  519. QMessageBox::Ok);
  520. ui->lineEdit_SendFileAddr->setText( ""); //清除数据
  521. return;
  522. }
  523. ui->label_All_Byete->setText(tr( "总字节数:%1").arg(SendFile.size()));
  524. ui->progressBar_SendFileProgress->setMaximum(SendFile.size()); //设置进度条最大值
  525. ui->progressBar_SendFileProgress->setValue( 0); //进度条清0
  526. FileSendCnt= 0; //清除文件发送的字节数
  527. TxCnt= 0; //清除发送的字节数
  528. FileSendTimer->start(ui->spinBox_OnePackageSendTime->value()); //设置定时器超时时间
  529. FileSendStat= 1; //开始发送标志
  530. UartSendTimer->stop(); //停止循环发送的定时器,防止干扰计数
  531. ui->tabWidget->setTabEnabled( 0, false); //设置指定页面失能
  532. ui->tabWidget->setTabEnabled( 1, false); //设置指定页面失能
  533. ui->tabWidget->setTabEnabled( 3, false); //设置指定页面失能
  534. ui->tabWidget->setTabEnabled( 4, false); //设置指定页面失能
  535. }
  536. //文件发送帮助提示
  537. void UART_MainWindow::on_pushButton_SendFileHelp_clicked()
  538. {
  539. QMessageBox::warning( this, tr( "文件发送帮助"),
  540. tr( "为了方便下位机接收文件数据,文件将进行分包发送\n"
  541. "每一包的字节大小可以自行设置,范围(1~4096字节)\n"
  542. "每一包数据发送的时间间隔也可以自行设置,范围(1~9999ms)\n"
  543. "注意: 每包的字节数量和间隔时间只有在开始发送文件之前设置有效!\n"),
  544. QMessageBox::Ok);
  545. }
  546. //停止文件发送
  547. void UART_MainWindow::on_pushButton_StopSendFile_clicked()
  548. {
  549. FileSendTimer->stop(); //停止定时器
  550. FileSendStat= 0; //清除标志
  551. ui->tabWidget->setTabEnabled( 0, true); //设置指定页面使能
  552. ui->tabWidget->setTabEnabled( 1, true); //设置指定页面使能
  553. ui->tabWidget->setTabEnabled( 3, true); //设置指定页面使能
  554. ui->tabWidget->setTabEnabled( 4, true); //设置指定页面使能
  555. }
  556. //开始文件发送
  557. void UART_MainWindow::FileSendTimeUpdate()
  558. {
  559. int sen_len=ui->spinBox_OnePackageSendByte->value(); //每次发送的长度
  560. int cnt=SendFile.read(FileSendBuff,sen_len);
  561. QByteArray array(FileSendBuff,cnt); //构造数组
  562. UartSendData( array); //发送数据
  563. if(cnt!=sen_len)
  564. {
  565. FileSendTimer->stop(); //停止定时器
  566. }
  567. //可以增加优化代码,等待发送完毕
  568. }
  569. //实际发送成功的数据
  570. void UART_MainWindow::WriteDataLen(qint64 cnt)
  571. {
  572. if(FileSendStat)
  573. {
  574. FileSendCnt+=cnt;
  575. ui->progressBar_SendFileProgress->setValue(FileSendCnt); //更新进度条
  576. if(FileSendCnt==SendFile.size()) //判断是否发送完毕
  577. {
  578. QMessageBox::warning( this, tr( "文件发送状态"),
  579. tr( "----文件发送成功!----"),
  580. QMessageBox::Ok);
  581. FileSendStat= 0; //清除标志
  582. SendFile.close(); //关闭文件
  583. ui->tabWidget->setTabEnabled( 0, true); //设置指定页面使能
  584. ui->tabWidget->setTabEnabled( 1, true); //设置指定页面使能
  585. ui->tabWidget->setTabEnabled( 3, true); //设置指定页面使能
  586. ui->tabWidget->setTabEnabled( 4, true); //设置指定页面使能
  587. }
  588. }
  589. }
  590. //模拟物联网控制_LED1
  591. void UART_MainWindow::on_pushButton_LED1_clicked()
  592. {
  593. if(UART_Config->isOpen()== false) return;
  594. static bool state= 1;
  595. if(state) //开启LED
  596. {
  597. UartSendData( QByteArray( "LED1_ON"));
  598. ui->pushButton_LED1->setText( "关闭LED1");
  599. }
  600. else
  601. {
  602. UartSendData( QByteArray( "LED1_OFF"));
  603. ui->pushButton_LED1->setText( "开启LED1");
  604. }
  605. state=!state;
  606. }
  607. //模拟物联网控制_LED2
  608. void UART_MainWindow::on_pushButton_LED2_clicked()
  609. {
  610. if(UART_Config->isOpen()== false) return;
  611. static bool state= 1;
  612. if(state) //开启LED
  613. {
  614. UartSendData( QByteArray( "LED2_ON"));
  615. ui->pushButton_LED2->setText( "关闭LED2");
  616. }
  617. else
  618. {
  619. UartSendData( QByteArray( "LED2_OFF"));
  620. ui->pushButton_LED2->setText( "开启LED2");
  621. }
  622. state=!state;
  623. }
  624. //模拟物联网控制_LED3
  625. void UART_MainWindow::on_pushButton_LED3_clicked()
  626. {
  627. if(UART_Config->isOpen()== false) return;
  628. static bool state= 1;
  629. if(state) //开启LED
  630. {
  631. UartSendData( QByteArray( "LED3_ON"));
  632. ui->pushButton_LED3->setText( "关闭LED3");
  633. }
  634. else
  635. {
  636. UartSendData( QByteArray( "LED3_OFF"));
  637. ui->pushButton_LED3->setText( "开启LED3");
  638. }
  639. state=!state;
  640. }
  641. //模拟物联网控制_LED4
  642. void UART_MainWindow::on_pushButton_LED4_clicked()
  643. {
  644. if(UART_Config->isOpen()== false) return;
  645. static bool state= 1;
  646. if(state) //开启LED
  647. {
  648. UartSendData( QByteArray( "LED4_ON"));
  649. ui->pushButton_LED4->setText( "关闭LED4");
  650. }
  651. else
  652. {
  653. UartSendData( QByteArray( "LED4_OFF"));
  654. ui->pushButton_LED4->setText( "开启LED4");
  655. }
  656. state=!state;
  657. }
  658. //模拟物联网控制_BEEP
  659. void UART_MainWindow::on_pushButton_BEEP_clicked()
  660. {
  661. if(UART_Config->isOpen()== false) return;
  662. static bool state= 1;
  663. if(state) //开启LED
  664. {
  665. UartSendData( QByteArray( "BEEP_ON"));
  666. ui->pushButton_BEEP->setText( "关闭BEEP");
  667. }
  668. else
  669. {
  670. UartSendData( QByteArray( "BEEP_OFF"));
  671. ui->pushButton_BEEP->setText( "开启BEEP");
  672. }
  673. state=!state;
  674. }
  675. //模拟物联网控制_RTC时间校准
  676. void UART_MainWindow::on_pushButton_RTC_Time_clicked()
  677. {
  678. QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间
  679. QString str1= "按照本地时间进行校准:\n";
  680. str1+=time.toString( "yyyy-MM-dd hh:mm:ss ddd\n"); //设置显示格式
  681. //获取本地时间校准物联网开发板RTC时间
  682. QString str2= "*"; //加上标识符进行区分
  683. str2+=time.toString( "yyyyMMddhhmmss"); //设置显示格式
  684. str1+= "串口发出的数据:";
  685. str1+=str2;
  686. QMessageBox::about( this, "校准RTC时间",str1);
  687. QByteArray text=str2.toLocal8Bit();
  688. UartSendData(text); //发送数据
  689. }
  690. //帮助信息提示
  691. void UART_MainWindow::on_action_help_info_triggered()
  692. {
  693. QMessageBox::about( this, "关于", "软件用于串口调试,支持基本数据收发,支持文件发送\n"
  694. "支持模拟物联网控制\n"
  695. "软件作者:DS小龙哥\n"
  696. "BUG反馈:1126626497@qq.com");
  697. }
  698. void UART_MainWindow::on_pushButton_flush_uart_clicked()
  699. {
  700. QList<QSerialPortInfo> UartInfoList=QSerialPortInfo::availablePorts(); //获取可用串口端口信息
  701. ui->comboBox_ComSelect->clear();
  702. if(UartInfoList.count()> 0)
  703. {
  704. for( int i= 0;i<UartInfoList.count();i++)
  705. {
  706. if(UartInfoList.at(i).isBusy()) //如果当前串口 COM 口忙就返回真,否则返回假
  707. {
  708. QString info=UartInfoList.at(i).portName();
  709. info+= "(占用)";
  710. ui->comboBox_ComSelect->addItem(info); //添加新的条目选项
  711. }
  712. else
  713. {
  714. ui->comboBox_ComSelect->addItem(UartInfoList.at(i).portName()); //添加新的条目选项
  715. }
  716. }
  717. }
  718. else
  719. {
  720. ui->comboBox_ComSelect->addItem( "无可用串口"); //添加新的条目选项
  721. }
  722. }

3.2 widget.h代码


  
  1. #ifndef UART_MAINWINDOW_H
  2. #define UART_MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QFile>
  5. #include <QSerialPortInfo>
  6. #include <QSerialPort>
  7. #include <QDebug>
  8. #include <QMessageBox>
  9. #include <QDateTime>
  10. #include <QScrollBar>
  11. #include <QDesktopServices>
  12. #include <Qtimer>
  13. #include <QFileDialog>
  14. #include <QTextEdit>
  15. #include <QHBoxLayout>
  16. #include <QLineEdit>
  17. #include <QThread>
  18. namespace Ui {
  19. class UART_MainWindow;
  20. }
  21. class UART_MainWindow : public QMainWindow
  22. {
  23. Q_OBJECT
  24. public:
  25. explicit UART_MainWindow(QWidget *parent = 0);
  26. ~UART_MainWindow();
  27. void SetStyle(const QString &qssFile); //样式表设置函数
  28. void UartSendData(QByteArray SendText);
  29. QSerialPortInfo *UART_Info;
  30. QSerialPort *UART_Config; //串口
  31. QTimer *UartSendTimer;
  32. QTimer *FileSendTimer;
  33. /*状态栏*/
  34. QWidget *StatusWindow;
  35. QTextEdit *LcdShowTxCnt;
  36. QTextEdit *LcdShowRxCnt;
  37. QLabel *LabelShowTx;
  38. QLabel *LabelShowRx;
  39. QHBoxLayout *Statuslayout;
  40. int RxCnt; //接收数量
  41. int TxCnt; //发送数量
  42. QList<QLineEdit*> LineEditSendList; //构造多条发送的列表
  43. QFile SendFile; //发送的文件
  44. char FileSendBuff[ 4096]; //最大发送数量
  45. int FileSendCnt; //记录文件发送字节数
  46. bool FileSendStat; //文件发送状态
  47. private slots:
  48. void FileSendTimeUpdate();
  49. void WriteDataLen(qint64); //实际发送的数据通知
  50. void on_comboBox_BaudSelect_currentTextChanged(const QString &arg1);
  51. void on_comboBox_StopBit_currentTextChanged(const QString &arg1);
  52. void on_comboBox_DataBits_currentTextChanged(const QString &arg1);
  53. void on_comboBox_Parity_activated(const QString &arg1);
  54. void on_checkBox_RTS_CTS_clicked();
  55. void on_checkBox_XON_XOFF_clicked();
  56. void on_pushButton_OpenUart_clicked();
  57. void ReadUasrtData();
  58. void on_pushButton_ClearData_clicked();
  59. void on_pushButton_SendData_clicked();
  60. void on_pushButton_ClearSend_clicked();
  61. void on_commandLinkButton_link_clicked();
  62. void on_checkBox_Time_Send_clicked();
  63. void SendTimeUpdate();
  64. void on_pushButton_SaveData_clicked();
  65. void on_pushButton_send_1_clicked();
  66. void on_pushButton_send_2_clicked();
  67. void on_pushButton_send_3_clicked();
  68. void on_pushButton_send_4_clicked();
  69. void on_pushButton_send_5_clicked();
  70. void on_pushButton_send_6_clicked();
  71. void on_pushButton_send_7_clicked();
  72. void on_pushButton_send_8_clicked();
  73. void on_pushButton_send_9_clicked();
  74. void on_pushButton_send_10_clicked();
  75. void on_pushButton_send_11_clicked();
  76. void on_pushButton_send_12_clicked();
  77. void on_pushButton_SlectSendList_clicked();
  78. void on_pushButton_ClearSendList_clicked();
  79. void on_pushButton_SendListExplain_clicked();
  80. void on_pushButton_SelectSendFile_clicked();
  81. void on_pushButton_StartSendFile_clicked();
  82. void on_pushButton_SendFileHelp_clicked();
  83. void on_pushButton_StopSendFile_clicked();
  84. void on_pushButton_LED1_clicked();
  85. void on_pushButton_LED2_clicked();
  86. void on_pushButton_LED3_clicked();
  87. void on_pushButton_LED4_clicked();
  88. void on_pushButton_BEEP_clicked();
  89. void on_pushButton_RTC_Time_clicked();
  90. void on_action_help_info_triggered();
  91. void on_pushButton_flush_uart_clicked();
  92. private:
  93. Ui::UART_MainWindow *ui;
  94. };
  95. #endif // UART_MAINWINDOW_H

3.3  UI设计界面

 

 


转载:https://blog.csdn.net/xiaolong1126626497/article/details/116040983
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场