日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

openmv串口数据 串口助手_Qt小项目之串口助手控制LED

發(fā)布時(shí)間:2024/4/19 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 openmv串口数据 串口助手_Qt小项目之串口助手控制LED 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

最近剛學(xué)了一點(diǎn)Qt開發(fā)上位機(jī),嘗試著做個(gè)小軟件練練手。查找了很多資料,做了一個(gè)簡單的串口助手,可以實(shí)現(xiàn)串口基本發(fā)送和接收功能,支持中文顯示,還可以控制STM32開發(fā)板上的兩個(gè)LED。

1.軟件界面

2.主要功能:

  • 啟動自動搜索本機(jī)串口,或者手動點(diǎn)擊搜索鍵掃描串口

  • 自定義波特率

  • 支持中文顯示

  • 支持發(fā)送新行

3.實(shí)際效果:

(GIF壓縮后根本沒法看。。。。)

花了大概3天時(shí)間吧,找了很多資料,功能很簡單, 但想著是自己一點(diǎn)一點(diǎn)開發(fā)的,還是挺有成就感的哈!

寫這篇文章是為了總結(jié)一下開發(fā)的過程和一些知識點(diǎn),主要包括兩部分,上位機(jī)的實(shí)現(xiàn)和STM32端程序的實(shí)現(xiàn)。

Qt上位機(jī)的實(shí)現(xiàn)

0.新建一個(gè)Dialog項(xiàng)目

新建一個(gè)Dialog項(xiàng)目,這3種基類的區(qū)別可以根據(jù)你的程序來確定。

  • 如果需要嵌入到其他窗體中,則基于QWidget創(chuàng)建。

  • 如果是主窗體,則基于QMainWindow創(chuàng)建,有菜單欄,狀態(tài)欄,工具欄等。

  • 如果是頂級對話框,則基于QDialog創(chuàng)建。

1.軟件UI界面的設(shè)計(jì)

使用Qt Designer添加所需要的控件,并進(jìn)行合理布局,盡量每一個(gè)控件,起一個(gè)合理易懂的名字。

2.串口庫的添加

pro文件添加一行:

QT += serialport

對應(yīng)的頭文件包含:

#include <QSerialPort>

#include <QSerialPortInfo>

3.串口自動搜索功能的實(shí)現(xiàn)

自動搜索本機(jī)串口,并在ComboBox中添加串口號

ui->cbb_com->clear();

//運(yùn)行開始查找可用串口

foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())

{

ui->cbb_com->addItem(info.portName()); //串口號下拉菜單,增加一個(gè)條目,為串口號COM4

qDebug() << "串口搜索完成";

}

4.串口的配置和打開關(guān)閉

//打開串口按鈕

void Dialog::on_btn_uart_Ctrl_clicked()

{

// static bool flag; //也可以用標(biāo)志位實(shí)現(xiàn)

if(this->ui->btn_uart_Ctrl->text() == "打開串口") //初始狀態(tài),配置串口參數(shù)

{

serial.setPortName(ui->cbb_com->currentText()); //設(shè)置串口號、

serial.setBaudRate(ui->cbb_baud->currentText().toInt()); //設(shè)置波特率

serial.setDataBits(QSerialPort::Data8); //設(shè)置串口數(shù)據(jù)位8

serial.setParity(QSerialPort::NoParity); //無校驗(yàn)位

serial.setStopBits(QSerialPort::OneStop); //1位停止位

serial.setFlowControl(QSerialPort::NoFlowControl);

//打開串口

if(!serial.open(QIODevice::ReadWrite))

{

QMessageBox::critical(NULL, "提示", "串口打開失敗");

return;

}

qDebug() << "串口打開成功";

this->ui->btn_uart_Ctrl->setText("關(guān)閉串口");

}

else

{

//關(guān)閉串口

serial.close();

this->ui->btn_uart_Ctrl->setText("打開串口");

}

}

5.串口發(fā)送數(shù)據(jù)

serial.write("A1\n"); //串口發(fā)送A1

6.串口數(shù)據(jù)的接收和顯示,支持中文

QT默認(rèn)的編碼是unicode,不能顯示中文的,windows默認(rèn)使用(GBK/GB2312/GB18030),使用了fromLocal8Bit()函數(shù),實(shí)現(xiàn)了從Unicode到本地字符集GBK的轉(zhuǎn)換,用于處理漢語顯示亂碼等問題

槽函數(shù)的實(shí)現(xiàn):

//串口數(shù)據(jù)接收并顯示

void Dialog::serialPort_readyRead()

{

QByteArray rx_buf = serial.readAll(); //讀取串口接收的數(shù)據(jù)

if(rx_buf.endsWith("\r\n")) //判斷接收最后是否是回車換行,即接收完成標(biāo)志

{

}

QString rx_buf_tmp = QString::fromLocal8Bit(rx_buf); //轉(zhuǎn)換為中文格式

qDebug() << rx_buf_tmp; //控制臺輸出

ui->tb_rx_buf->append(rx_buf_tmp);

rx_buf_tmp.clear();

rx_buf.clear();

}

connect語句:

connect(&serial, & QSerialPort::readyRead, this, &Dialog::serialPort_readyRead);

7.下拉框自定義波特率的實(shí)現(xiàn)

//自定義波特率

void Dialog::on_cbb_baud_currentIndexChanged(const QString &arg1)

{

if(this->ui->cbb_baud->currentIndex() == 3)

{

this->ui->cbb_baud->setItemText(3, ""); //調(diào)成自定義波特率時(shí),內(nèi)容設(shè)置為空,準(zhǔn)備接收輸入

this->ui->cbb_baud->setEditable(true);

}

else

{

this->ui->cbb_baud->setItemText(3, "自定義"); //調(diào)成自定義波特率時(shí),內(nèi)容設(shè)置為空,準(zhǔn)備接收輸入

this->ui->cbb_baud->setEditable(false);

}

serial.setBaudRate(ui->cbb_baud->currentText().toInt()); //即使打開串口后,仍然可以設(shè)置波特率

}

8.發(fā)送新行功能的實(shí)現(xiàn)

通過一個(gè)全局變量實(shí)現(xiàn),發(fā)送新行按鈕勾選時(shí),標(biāo)志位置1,然后發(fā)送按鈕功能里,根據(jù)標(biāo)志位決定是否在末尾添加換行符。

對應(yīng)的槽函數(shù)實(shí)現(xiàn):

//是否發(fā)送新行

void Dialog::on_cb_send_enter_clicked()

{

if(ui->cb_send_enter->isChecked())

{

send_enter_flag = true;

qDebug() << "發(fā)送新行";

}

else

{

send_enter_flag = false;

qDebug() << "不發(fā)送新行";

}

}

//發(fā)送按鈕被按下

void Dialog::on_btn_send_clicked()

{

//獲取多行輸入框的數(shù)據(jù)并轉(zhuǎn)換為UTF8格式

QByteArray tx_buf = ui->te_tx_buf->toPlainText().toUtf8();

if(send_enter_flag == true)

tx_buf += "\n";

serial.write(tx_buf); //把數(shù)據(jù)通過串口發(fā)送出去

tx_buf.clear();

}

9.只改變標(biāo)簽顏色

本來想著通過改變樣式表的方式改變顏色

this->ui->lbe_blue->setStyleSheet("color: rgb(255, 0, 0);");

但是,實(shí)際運(yùn)行時(shí),連字體和大小都改成了默認(rèn)的,有沒有一種只改變顏色其他的格式不變的方法呢?還真有,如下,不過好像只支持標(biāo)準(zhǔn)顏色?

QPalette colr;

colr.setColor(QPalette::WindowText,Qt::red); //設(shè)置標(biāo)簽顏色紅色

this->ui->lbe_red->setPalette(colr);

10.按鈕的使能失能控制

以下兩行語句效果相同,都是失能按鈕功能:

this->ui->btn_led1_Ctrl->setDisabled(true); //LED控制按鈕不可用

this->ui->btn_led1_Ctrl->setEnabled(false); //LED控制按鈕不可用

11.文本顯示框設(shè)置最大顯示行數(shù)

this->ui->tb_rx_buf->document()->setMaximumBlockCount(10);

程序的圖標(biāo)、標(biāo)題設(shè)置和打包發(fā)布

你不希望窗口的標(biāo)題是“Dialog”吧,所以添加一個(gè)標(biāo)題和一個(gè)好看的圖標(biāo)還是很有必要的。

1.添加標(biāo)題

添加窗口標(biāo)題還是很簡單的,一行代碼:

this->setWindowTitle("串口控制LED - By wcc ");

2.添加icon圖標(biāo)

  • 找一個(gè)好看的圖標(biāo),格式一定要是.ico,像素大小推薦128*128

  • 命名為my_app.ico,名字無所謂,不要有中文就好了,放在工程目錄下,即和.pro文件和.cpp文件同一個(gè)目錄。

  • 打開.pro文件,最底下添加一行:RCICONS = myapp.ico

重新編譯就可以看到這種效果了。

3.程序文件的生成

構(gòu)建選項(xiàng)改成Release版本,編譯完成后,會在Release目錄下生成一個(gè).exe文件,把這個(gè)文件單獨(dú)拷出來放在一個(gè)空白的文件夾里,如?D:\QT_Prj\Export\UART_Demo.exe,可以運(yùn)行試一下,會提示缺少運(yùn)行所需要的dll組件

而且,這個(gè)文件如果單獨(dú)拷貝到其他沒有安裝Qt環(huán)境的電腦上,也是不能運(yùn)行的。

所以我們需要添加一些當(dāng)前程序運(yùn)行所需要的組件才能正常運(yùn)行,但是需要添加哪些文件呢?不用擔(dān)心,Qt早已經(jīng)想好了,運(yùn)行MinGW工具:

先進(jìn)入到exe文件所在的文件夾中:?cd/d D:\QT_Prj\Export

然后輸入命令:?windeployqt UART_Demo.exe

此時(shí),打開exe文件所在的文件夾,可以看到Qt已經(jīng)為我們添加好了,當(dāng)前程序運(yùn)行所需要的組件了。

這個(gè)時(shí)候,如果想給別人分享你開發(fā)好的上位機(jī)軟件,就可以直接把這個(gè)文件夾拷貝給他。當(dāng)然也可以安裝一個(gè)?EnigmaVirtualBox軟件,把當(dāng)前目錄下的所有文件打包成一個(gè)exe文件。

STM32端程序的實(shí)現(xiàn)

連接串口模塊,發(fā)送接收短接,可以看出Qt上位機(jī)的的收發(fā)都是正常的。下一步就是編寫STM32端的程序了,很簡單,當(dāng)接收到字符串"A1"時(shí),點(diǎn)亮紅燈;當(dāng)接收到字符串“A2”時(shí),熄滅紅燈;當(dāng)接收到字符串“B1”時(shí),點(diǎn)亮藍(lán)燈;當(dāng)接收到字符串“B2”時(shí),熄滅藍(lán)燈,每個(gè)字符串結(jié)尾都有換行符“\n”,即:

上位機(jī)發(fā)送 | 單片機(jī)執(zhí)行 :-: | :-: A1 | 紅燈點(diǎn)亮 A2 | 紅燈熄滅 B1 | 藍(lán)燈點(diǎn)亮 B2 | 藍(lán)燈熄滅

實(shí)現(xiàn)思路也很簡單,即把接收到的字符存入一個(gè)字符數(shù)組,當(dāng)接收到“\n”換行標(biāo)志時(shí),意味著接收完成,判斷此時(shí)數(shù)組的內(nèi)容,分別和命令比較,如果一致,執(zhí)行相應(yīng)的操作,串口1中斷服務(wù)函數(shù):

void USART1_IRQHandler(void)

{

char dat;

char flag = 0;

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷

{

dat = USART1->DR;

if(usart1Len >= 64) //防止數(shù)據(jù)過多,導(dǎo)致內(nèi)存溢出

usart1Len = 0;

if(dat == 0x0D || dat == 0x0A) //回車換行,接收完成,此時(shí)的buf不含回車換行

{

if(strcmp(usart1Buf, "A2") == 0) //字符串比較

{

UsartPrintf(USART1, "紅燈熄滅\r\n");

GPIO_SetBits(GPIOB, GPIO_Pin_9);

}

else if(strcmp(usart1Buf, "A1") == 0)

{

UsartPrintf(USART1, "紅燈點(diǎn)亮\r\n");

GPIO_ResetBits(GPIOB, GPIO_Pin_9);

}

else if(strcmp(usart1Buf, "B2") == 0)

{

UsartPrintf(USART1, "藍(lán)燈熄滅\r\n");

GPIO_SetBits(GPIOB, GPIO_Pin_6);

}

else if(strcmp(usart1Buf, "B1") == 0)

{

UsartPrintf(USART1, "藍(lán)燈點(diǎn)亮\r\n");

GPIO_ResetBits(GPIOB, GPIO_Pin_6);

}

usart1Len = 0;

memset(usart1Buf,0,64);

}

else

{

usart1Buf[usart1Len++] = dat;

}

USART_ClearFlag(USART1, USART_FLAG_RXNE);

}

}

程序還是很簡單。板子是用的中移的麒麟座Mini板,基于F103C8T6的,串口1連接上位機(jī),波特率115200,PB9-紅燈,PB6-綠燈,都是低電平點(diǎn)亮。

改進(jìn)和優(yōu)化的地方

  • 按鈕發(fā)送字符可自定義

  • 界面UI的設(shè)計(jì)優(yōu)化

  • 數(shù)據(jù)波形的顯示

  • 發(fā)送和接收,16進(jìn)制和字符模式的切換

  • 定時(shí)發(fā)送功能

  • 接收內(nèi)容保存成文件

  • 一個(gè)小Bug,不支持多個(gè)串口的自動搜索。

Qt工程和STM32工程下載

由于國內(nèi)Github下載速度實(shí)在令人著急,Qt工程文件和STM32工程文件,還包括EnigmaVirtualBox的安裝包,我都已經(jīng)上傳到國內(nèi)的碼云Gitee上了,有需要的朋友可以在Git中使用以下命令下載:

git clone https://gitee.com/whik/qt_uart_demo.git

或者是在公眾號后臺回復(fù)【串口助手】,我會把下載鏈接發(fā)送給你。

當(dāng)然,如果有朋友也在學(xué)習(xí)Qt開發(fā)上位機(jī),歡迎互相交流學(xué)習(xí)。

如果這篇文章對你有所幫助,那就動動你的小手點(diǎn)個(gè)好看吧~


歷史精選文章:

  • 一鍵自動格式化你的代碼

  • C標(biāo)準(zhǔn)庫string.h中幾個(gè)常用函數(shù)的使用詳解

  • Jlink使用技巧之讀取STM32內(nèi)部的程序

  • Jlink使用技巧系列教程索引

  • C語言學(xué)習(xí)之枚舉類型

  • C語言學(xué)習(xí)之結(jié)構(gòu)體


歡迎大家關(guān)注我的個(gè)人博客:?

http://www.wangchaochao.top

或微信掃碼關(guān)注我的公眾號

總結(jié)

以上是生活随笔為你收集整理的openmv串口数据 串口助手_Qt小项目之串口助手控制LED的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。