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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

串口调试工具开发

發布時間:2024/1/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 串口调试工具开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

剛學習Qt,搜查資料,根據學到的知識,完成一個簡單的串口調試工具~剛入行,諒解

最終效果圖,圖上功能都可實現

UI界面繪制:

代碼如下:

串口調試工具開發1.創建工程QWidget,根據串口調試工具繪制Ui界面 給每個控件設置特定名,方便調用2.在.pro文件添加代碼 QT += core gui serialport3.在.h文件頭添加代碼 #include <QSerialPort> #include <QSerialPortInfo>private:Ui::Widget *ui;QSerialPort * serialport;//串口端口QTimer *timSend;//創建定時器對象QString mTime;//拼接日志樣式對象QDateTime mDateTime;//獲取當前時間QByteArray Sendtext;//發送緩存區QByteArray Receivetext;//接收緩存區long int SendByte=0;//發送字符數long int ReceByte=0;//接收字符數4.給串口號設置自動獲取電腦中的串口//遍歷可用串口設備//創建一個QStringList 對象來存儲端口名QStringList serialPort_Name;//foreach遍歷方法foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){//端口名呈現格式serialPort_Name << info.portName();}//添加到控件串口顯示ui->PostName->addItems(serialPort_Name);*如果需要過濾無用串口,代碼如下//獲取串口列表int snum=0;//用下面的方法會過濾掉一些無用的串口QSerialPort temp_serial;foreach (const QSerialPortInfo &Info, QSerialPortInfo::availablePorts()) {temp_serial.setPort(Info);if(temp_serial.open(QIODevice::ReadWrite)){//如果串口是可以讀寫方式打開的ui->PostName->addItem(Info.portName());temp_serial.close();++snum;}}//默認選中第0項if(snum>2){ui->PostName->setCurrentIndex(1);}ui->PostName->currentText();*如果需要對下拉框進行自適應設置,代碼如下//下拉列表自適應/* 獲取最長字符串 */int maxlen = 0;for (int index = 0; index < ui->PostName->count(); index++){if (ui->PostName->itemText(index).length() > maxlen){maxlen = ui->PostName->itemText(index).length();}}/*獲取字體磅值轉換為像素值*/int fontsize = ui->PostName->font().pointSize();//獲取字體的磅值ui->PostName->setFixedWidth(fontsize * maxlen * 0.75);//設置像素值 ```接下來需聲明一個串口全局對象,在.h文件中 QSerialPort * serialport;//串口端口聲明后在.cpp文件中創建出來 serialport = new QSerialPort(this);//聲明后把對象創建出來給打開按鈕設置轉到槽.h文件自動生成 private slots:void on_Btn_Open_clicked();//打開鍵按下/*打開按鈕配置*/ /*串口參數配置*/ void Widget::on_Btn_Open_clicked() {if (ui->Btn_Open->text()=="打開") {//設置串口名serialport->setPortName(ui->PostName->currentText());//設置波特率switch (ui->BaudRate->currentIndex()){case 0:serialport->setBaudRate(QSerialPort::Baud19200,QSerialPort::AllDirections);break;case 1:serialport->setBaudRate(QSerialPort::Baud38400,QSerialPort::AllDirections);break;case 2:serialport->setBaudRate(QSerialPort::Baud57600,QSerialPort::AllDirections);break;default:serialport->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections);break;} /* 檢驗位、數據位、停止位、流控制 與 波特率(switch)寫法一致 *///打開串口if(!serialport->open(QIODevice::ReadWrite)){QMessageBox::about(NULL,"提示","無法打開串口");return;}/*點擊后效果*///設置控件不可編輯ui->PostName->setEnabled(false);ui->BaudRate->setEnabled(false);ui->Parity->setEnabled(false);ui->DataBits->setEnabled(false);ui->StopBits->setEnabled(false);ui->FlowControl->setEnabled(false);//點擊打開按鈕后發送和循環發送可編輯ui->Btn_Send->setEnabled(true);ui->Cyclet_time->setEnabled(true);//點擊打開后顯示關閉ui->Btn_Open->setText("關閉");ui->Btn_Open->setStyleSheet("QPushButton{color:red;background:yellow}");/*點擊前效果*/與上方代碼相反,寫在else{}中 ```獲取時間戳/*獲取時間戳*/ 先在.h頭文件創建對象,如經常使用的對象,都在頭文件創建,減少損耗資源 QString mTime; QDateTime mDateTime; .cpp文件寫對應事件 if(ui->Re_Log->isChecked()){mDateTime = QDateTime::currentDateTime();//拼接日志樣式mTime = "[";mTime += mDateTime.toString("[yyyy-MM-dd hh:mm:ss.zzz]") ;mTime += "]:RECV ->" ;mTime += Receivetext;ui->Re_Edit->append(mTime);}添加數據換行問題,insertPlainText函數在原數據末尾直接添加,可以使用append函數替代換行添加if(ui->Re_Line->checkState()==Qt::Checked){ui->Re_Edit->append(Receivetext);}else{ui->Re_Edit->insertPlainText(Receivetext);} ```**串口接收代碼**/*串口接收*/ void Widget::on_SerialPort_readyRead(){int i,length;Receivetext = serialport->readAll();//接收字節并顯示ReceByte+=Receivetext.length();ui->Re_Byte->setText(QString::number(ReceByte));//十六進制if(ui->Re_Hex->checkState()==Qt::Checked){//字符串轉十六進制Receivetext = Receivetext.toHex().toUpper();length=Receivetext.length();for(i=0;i<=length/2;i++){//插入空格字符串Receivetext.insert((2+3*i),' ');}}//自動換行if(ui->Re_Line->checkState()==Qt::Checked){ui->Re_Edit->append(Receivetext);}//日志顯示樣式else if(ui->Re_Log->isChecked()){//獲取當前時間mDateTime = QDateTime::currentDateTime();//時間展示拼接樣式mTime = "[";mTime += mDateTime.toString("[yyyy-MM-dd hh:mm:ss.zzz]") ;mTime += "]:RECV ->" ;mTime += Receivetext;//append自動換行ui->Re_Edit->append(mTime);}else{//原數據末尾添加(文本接收)ui->Re_Edit->insertPlainText(Receivetext);} }**串口發送代碼**void Widget::on_Btn_Send_clicked() {int i,length;Sendtext = ui->Se_Edit->toPlainText().toUtf8();//發送設置HEXif(ui->Se_Hex->checkState()==Qt::Checked){//轉換成十六進制Sendtext = Sendtext.toHex().toUpper();length=Sendtext.length();for(i=0;i<=length/2;i++){//插入空格字符串Sendtext.insert((2+3*i),' ');}serialport->write(Sendtext);}else{serialport->write(Sendtext);}//發送字節顯示SendByte+=Sendtext.length();ui->Se_Byte->setText(QString::number(SendByte)); // ui->Se_Edit->moveCursor(QTextCursor::End);}定時器使用方法在.h頭文件中 //定義并初始化mTimerID int mTimerID= 0;/*定時器定時發送*///設置默認值1000ms mTimerID = startTimer(500);在.cpp文件中 void Widget::timerEvent(QTimerEvent *event) {qDebug()<<"我是定時器!"; } void Widget::closeEvent(QCloseEvent *event) {if(mTimerID){killTimer(mTimerID);mTimerID = 0;} }**串口循環發送代碼**在.h頭文件 QTimer *timSend;//創建定時器對象在.cpp文件 //定時發送=定時器timSend=new QTimer;timSend->setInterval(1000);//設置默認值1000ms//定時器信號連接發送信號connect(timSend,&QTimer::timeout,this,[=](){on_Btn_Send_clicked();});ui界面給循環發送checkbox轉到槽void on_Cyclet_time_stateChanged(int arg1);//循環發送void Widget::on_Cyclet_time_stateChanged(int arg1) {//獲取復選框狀態,沒有選就為0,選擇了就為2if(arg1==0){timSend->stop();}else {//對輸入的值大小的限制,小于10會彈出對話框提示if(ui->Se_Line_2->text().toInt()>=10){timSend->start(ui->Se_Line_2->text().toInt());//設置時長,重新計數}else {ui->Cyclet_time->setCheckState(Qt::Unchecked);QMessageBox::information(this,"錯誤提示","定時發送最小間隔為10ms!");}} }```清空按鈕在.h頭文件 void on_Btn_Reclean_clicked();//清空接收區域 void on_Btn_Seclean_clicked();//清空發送區域在.cpp文件 /*清空接收區域*/ void Widget::on_Btn_Reclean_clicked() {ui->Re_Edit->clear(); } /*清空發送區域*/ void Widget::on_Btn_Seclean_clicked() {ui->Se_Edit->clear(); }ASCII、HEX發送與接收在.h頭文件中 void on_Re_Hex_clicked();//點擊十六進制接收 void on_Se_Ascll_clicked();//點擊ASCII發送在.cpp文件中 /*十六進制接收*/ void Widget::on_Re_Hex_clicked() {ui->Re_Ascll->setCheckState(Qt::Unchecked);ui->Re_Hex->setCheckState(Qt::Checked); }/*ASCII發送*/ void Widget::on_Se_Ascll_clicked() {ui->Se_Ascll->setCheckState(Qt::Checked);ui->Se_Hex->setCheckState(Qt::Unchecked); }復位計數在.h頭文件中 void on_Btn_Reset_clicked();//復位計數在.cpp文件中 /*清除計數*/ void Widget::on_Btn_Reset_clicked() {SendByte = 0;ReceByte = 0;ui->Re_Byte->setText(QString::number(ReceByte));ui->Se_Byte->setText(QString::number(SendByte)); } ```

總結

以上是生活随笔為你收集整理的串口调试工具开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: jizz在线看| 午夜黄色小视频 | 福利电影一区 | 熟女人妻aⅴ一区二区三区60路 | 亚洲天堂欧美 | 午夜一级免费 | 久久久久亚洲日日精品 | 免费黄色a级片 | 大桥未久av一区二区三区中文 | 天天视频天天爽 | 热久久在线 | 国产一区二区播放 | 青青操在线观看 | 日本一级做a爱片 | 特黄特色免费视频 | 色一情一乱一乱一区91av | 国产情侣av自拍 | 丝袜制服中文字幕 | 亚洲成人免费在线视频 | 操操干 | 3d动漫精品啪啪一区二区免费 | 一个人看的www视频在线观看 | 少妇激情四射 | 日日av | 天天狠狠 | free女性xx性老大太 | 成人伊人网站 | 成人黄色大片在线观看 | 欧美激情va永久在线播放 | 91欧美一区二区三区 | 国产一区二区三区网站 | 激烈的性高湖波多野结衣 | xnxx国产| 欧美成性色 | 久久99精品国产.久久久久 | 人人干狠狠干 | 亚洲好看站| 领导揉我胸亲奶揉下面 | 欧美在线精品一区二区三区 | 污片在线免费看 | 在线视频一二区 | 国产操视频 | 我爱52av| 女女h百合无遮羞羞漫画软件 | 永久在线视频 | 国产美女一区二区三区 | 丰满肥臀噗嗤啊x99av | 在线免费看黄视频 | a级片在线视频 | 欧美日韩亚洲不卡 | 国产伦精品一区二区三区88av | 精品久久久影院 | 1024手机看片日韩 | 成年女人18级毛片毛片免费 | 男女在线观看 | 天天操天天操天天射 | 久久精品中文闷骚内射 | 欧美一区二区影院 | 日韩欧美一区二区三区视频 | 国产一页 | 亚洲第一狼人区 | 日剧网 | 麻豆一级片 | 99国产精品人妻噜啊噜 | 日韩色吧| 黄色一级视屏 | 国产91香蕉 | 国产精品久久久久久久久免费相片 | 久久精品黄aa片一区二区三区 | 38在线视频| jizz日韩 | www操操操 | 欧美一区二区三区视频在线 | 一级大片视频 | 黄网免费在线观看 | 1769国产精品视频 | 亚洲五码在线 | 国产日产欧洲无码视频 | 久久国内精品 | 亚洲免费专区 | 不卡在线一区 | 亚洲婷婷综合网 | 爱情岛论坛永久入址测速 | 黄色在线观看免费 | 一区二区成人av | 亚洲国产日韩精品 | av片网址| 欧美 日韩 国产 中文 | 日韩精品免费看 | 秋霞在线一区二区 | 欧美黄色免费网站 | 日本高清xxxx | 亚洲人免费视频 | 久久久久久久一区 | 少妇裸体性生交 | 毛片免费一区二区三区 | 久久黄色一级片 | 日韩欧美爱爱 | 好看的中文字幕 |