" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt實(shí)現(xiàn)串口助手

 更新時(shí)間:2022年08月19日 11:07:10   作者:林子xxx  
這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)串口助手,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Qt實(shí)現(xiàn)串口助手的具體代碼,供大家參考,具體內(nèi)容如下

1.界面布局

這是一個(gè)常見的串口助手布局。要說有什么不常見,大概就是發(fā)送可以選擇編碼方式:GBK/UTF8

2.要點(diǎn)

沒什么難度,就是水磨工夫,一點(diǎn)點(diǎn)寫。容易錯(cuò)處的地方都寫在代碼注釋里。

3.代碼

下面是 mainwindow.cpp 文件。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qdebug.h>
?
QSerialPort *serial;
?
MainWindow::MainWindow(QWidget *parent) :
? ? QMainWindow(parent),
? ? ui(new Ui::MainWindow)
{
? ? ui->setupUi(this);
? ? serial = new QSerialPort;
?
? ? findSerialPort();
?
? ? ui->cbbBaudrate->addItem(QStringLiteral("4800"), QSerialPort::Baud4800);
? ? ui->cbbBaudrate->addItem(QStringLiteral("9600"), QSerialPort::Baud9600);
? ? ui->cbbBaudrate->addItem(QStringLiteral("19200"), QSerialPort::Baud19200);
? ? ui->cbbBaudrate->addItem(QStringLiteral("38400"), QSerialPort::Baud38400);
? ? ui->cbbBaudrate->addItem(QStringLiteral("115200"), QSerialPort::Baud115200);
? ? ui->cbbBaudrate->setCurrentIndex(4);
? ? //添加數(shù)據(jù)位
? ? ?ui->cbbDataSize->addItem(QStringLiteral("5"), QSerialPort::Data5);
? ? ?ui->cbbDataSize->addItem(QStringLiteral("6"), QSerialPort::Data6);
? ? ?ui->cbbDataSize->addItem(QStringLiteral("7"), QSerialPort::Data7);
? ? ?ui->cbbDataSize->addItem(QStringLiteral("8"), QSerialPort::Data8);
? ? ?ui->cbbDataSize->setCurrentIndex(3);
? ? ?//添加奇偶校驗(yàn)位
? ? ?ui->cbbParity->addItem(tr("None"), QSerialPort::NoParity);
? ? ?ui->cbbParity->addItem(tr("Even"), QSerialPort::EvenParity);
? ? ?ui->cbbParity->addItem(tr("Odd"), QSerialPort::OddParity);
? ? ?ui->cbbParity->addItem(tr("Mark"), QSerialPort::MarkParity);
? ? ?ui->cbbParity->addItem(tr("Space"), QSerialPort::SpaceParity);
? ? ?ui->cbbParity->setCurrentIndex(0);
? ? ?//添加停止位
? ? ?ui->cbbStopbit->addItem(QStringLiteral("1"), QSerialPort::OneStop);
? ? ?ui->cbbStopbit->addItem(QStringLiteral("1.5"), QSerialPort::OneAndHalfStop);//
? ? ?ui->cbbStopbit->addItem(QStringLiteral("2"), QSerialPort::TwoStop);
? ? ?ui->cbbStopbit->setCurrentIndex(0);
? ? ?//添加流控位
? ? ?ui->cbbFlowbit->addItem(tr("None"), QSerialPort::NoFlowControl);
? ? ?ui->cbbFlowbit->addItem(tr("RTS/CTS"), QSerialPort::HardwareControl);
? ? ?ui->cbbFlowbit->addItem(tr("XON/XOFF"), QSerialPort::SoftwareControl);
? ? ?ui->cbbFlowbit->setCurrentIndex(0);
? ? ?//禁用發(fā)送按鈕
? ? ?ui->btnSend->setEnabled(false);
?
? ? ?ui->btnOpen->setStatusTip(tr("打開/關(guān)閉串口"));
? ? ?ui->rdbGbk->setStatusTip("以GBK編碼發(fā)送" );
? ? ?ui->rdbUtf8->setStatusTip(tr("以UTF8編碼發(fā)送"));
}
?
MainWindow::~MainWindow()
{
? ? delete ui;
}
?
void MainWindow::findSerialPort()
{
? ? ui->cbbPort->clear();
? ? foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
? ? {
? ? ? ? QSerialPort tempserial;
? ? ? ? tempserial.setPort(info);
?
? ? ? ? if(tempserial.open(QIODevice::ReadWrite))
? ? ? ? {
? ? ? ? ? ? ui->cbbPort->addItem(info.description()+":"+tempserial.portName(),tempserial.portName());
?
? ? ? ? ? ? tempserial.close();
? ? ? ? }
? ? }
}
?
void MainWindow::setsuienable( bool en )
{
? ? ui->cbbPort->setEnabled(en);
? ? ui->cbbBaudrate->setEnabled(en);
? ? ui->cbbDataSize->setEnabled(en);
? ? ui->cbbParity->setEnabled(en);
? ? ui->cbbStopbit->setEnabled(en);
? ? ui->cbbFlowbit->setEnabled(en);
}
?
void MainWindow::on_btnOpen_clicked()
{
? ? if(ui->btnOpen->text() ?!= "關(guān)閉")
? ? {
? ? ? ? if( !ui->cbbPort->currentText().isNull() )
? ? ? ? {
?
? ? ? ? ? ? ui->btnOpen->setText("關(guān)閉");
? ? ? ? ? ? ui->btnSend->setEnabled(true);
? ? ? ? ? ? ui->btnFind->setEnabled(false);
? ? ? ? ? ? setsuienable(false);
?
? ? ? ? ? ? serial->setPortName(ui->cbbPort->currentData(Qt::UserRole).value<QString>() ?);
? ? ? ? ? ? serial->setBaudRate(ui->cbbBaudrate->currentData(Qt::UserRole).value<qint32>() );
? ? ? ? ? ? serial->setDataBits(ui->cbbDataSize->currentData(Qt::UserRole).value<QSerialPort::DataBits>() );
? ? ? ? ? ? serial->setFlowControl(ui->cbbDataSize->currentData(Qt::UserRole).value<QSerialPort::FlowControl>() );
? ? ? ? ? ? serial->setParity(ui->cbbDataSize->currentData(Qt::UserRole).value<QSerialPort::Parity>() );
? ? ? ? ? ? serial->setStopBits(ui->cbbDataSize->currentData(Qt::UserRole).value<QSerialPort::StopBits>() );
? ? ? ? ? ? serial->open(QIODevice::ReadWrite);
?
?
? ? ? ? ? ? connect(serial, &QSerialPort::readyRead, this, &MainWindow::serialReadData);
? ? ? ? }
? ? }
? ? else
? ? {
? ? ? ? serial->close();
? ? ? ? setsuienable(true);
? ? ? ? ui->btnSend->setEnabled(false);
? ? ? ? ui->btnOpen->setText("打開");
? ? ? ? ui->btnFind->setEnabled(true);
? ? }
}
?
//字符串?dāng)?shù)據(jù)轉(zhuǎn)為HEX,16進(jìn)制形式。譬如將 “30”轉(zhuǎn)為“0”
bool StringToHex( QString &dst,const QString src )
{
? ? QStringList list = src.trimmed().split(QRegExp("\t|\n|\r\n|\r| |,|;")); //去除頭尾空白,再分割
?
? ? foreach (QString n, ?list )
? ? {
? ? ? ? bool res;
? ? ? ? if(n.isEmpty())continue;
? ? ? ? int d= n.toInt(&res,16);
? ? ? ? if(d>255){ ?return ?false ;}
?
? ? ? ? char ?c = d;
? ? ? ? if(res)
? ? ? ? ? ? dst.append(c);
? ? ? ? else
? ? ? ? ? ? return ?false ;
? ? }
? ? return true;
}
//UTF8轉(zhuǎn)為GBK
QByteArray Utf8ToGbk(QByteArray buf)
{
? ? QTextCodec* Utf8Codec = QTextCodec::codecForName("UTF-8");
? ? QTextCodec::setCodecForLocale(Utf8Codec);
? ? QTextCodec* GbkCodec = QTextCodec::codecForName("GBK");
?
? ? QByteArray ByteGbk = GbkCodec->fromUnicode( Utf8Codec->toUnicode( buf ) ); ? //先Unicode編碼,后arr
?
? ? return ?ByteGbk ;
}
//串口發(fā)送
void MainWindow::on_btnSend_clicked()
{
? ? if( ui->teSend->toPlainText() .isEmpty() )return;
?
? ? if( ui->ckbSendhex->isChecked() ?)
? ? {
? ? ? ? QString txt;
? ? ? ? if( StringToHex( txt ,ui->teSend->toPlainText() ) )
? ? ? ? {
? ? ? ? ? ? serial->write( txt.toLatin1() ?);
? ? ? ? }else
? ? ? ? {
? ? ? ? ? ? QMessageBox::about(this,tr("提示"),tr("HEX數(shù)據(jù)格式錯(cuò)誤,\n數(shù)據(jù)形式類似:30 34 56"));
? ? ? ? }
? ? }
? ? else{
? ? ? ? if( ui->rdbUtf8->isChecked() )
? ? ? ? {
? ? ? ? ? ? serial->write( ui->teSend->toPlainText().toUtf8() ? );
? ? ? ? }else
? ? ? ? {
? ? ? ? ? ? QByteArray arrutf8 =ui->teSend->toPlainText().toLocal8Bit();
? ? ? ? ? ? serial->write( Utf8ToGbk(arrutf8) ? );
? ? ? ? }
? ? }
}
?
//串口接收處理
void MainWindow::serialReadData()
{
? ?//注意,直接append會(huì)從下一行開始,所以先放入QString
? ? QByteArray buf = serial->readAll();
? ? if(!buf.isEmpty())
? ? {
? ? ? ? QString txt = ui->teReceive->toPlainText();
?
? ? ? ? if( ui->ckbReceivehex->isChecked() )
? ? ? ? {
? ? ? ? ? ? ui->teReceive->append( QString( buf.toHex(' ') ) );
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? QTextCodec::ConverterState state;
? ? ? ? ? ? QTextCodec *codec = QTextCodec::codecForName("UTF-8");
? ? ? ? ? ? QString str = codec->toUnicode( buf.constData(), buf.size(), &state);
? ? ? ? ? ? if ( state.invalidChars )
? ? ? ? ? ? {
? ? ? ? ? ? ? ?str = QTextCodec::codecForName( "GBK" )->toUnicode(buf);
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ?str = ?codec->toUnicode(buf);
? ? ? ? ? ? }
? ? ? ? ? ? ui->teReceive->clear();
? ? ? ? ? ? ui->teReceive->append( ?txt+str ?);
? ? ? ? }
? ? }
?
}
?
void MainWindow::on_btnClearReceive_clicked()
{
? ? ui->teReceive->clear();
}
?
void MainWindow::on_btnClearSend_clicked()
{
? ? ui->teSend->clear();
}
?
void MainWindow::on_btnFind_clicked()
{
? ? ui->btnFind->setEnabled(false);
? ? findSerialPort();
? ? ui->btnFind->setEnabled(true);
}

4.效果

測(cè)試可以發(fā)送和接收GK/UTF8編碼的數(shù)據(jù)。下圖是和ATK-XCOM通過虛擬串口交互。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解C++ 引用

    詳解C++ 引用

    這篇文章主要介紹了C++ 引用的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C++ Boost Spirit入門教程

    C++ Boost Spirit入門教程

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • C++ 中boost::share_ptr智能指針的使用方法

    C++ 中boost::share_ptr智能指針的使用方法

    這篇文章主要介紹了C++ 中boost::share_ptr智能指針的使用方法的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • C語言數(shù)據(jù)結(jié)構(gòu)單鏈表接口函數(shù)全面講解教程

    C語言數(shù)據(jù)結(jié)構(gòu)單鏈表接口函數(shù)全面講解教程

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)單鏈表所有接口函數(shù)的全面講解教程,有需要朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-10-10
  • C++中 string 中的常用方法使用心得

    C++中 string 中的常用方法使用心得

    這篇文章主要介紹了C++中 string 中的常用方法使用心得,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C語言中的strncpy()函數(shù)的用法及應(yīng)用場(chǎng)景詳解

    C語言中的strncpy()函數(shù)的用法及應(yīng)用場(chǎng)景詳解

    在C語言編程中,strncpy函數(shù)用于安全地復(fù)制字符串,它可以指定復(fù)制的字符數(shù)以防止緩沖區(qū)溢出,這篇文章主要介紹了C語言中的strncpy()函數(shù)的用法及應(yīng)用場(chǎng)景的相關(guān)資料,并提供了示例代碼,需要的朋友可以參考下
    2024-10-10
  • c++11 新特性——智能指針使用詳解

    c++11 新特性——智能指針使用詳解

    這篇文章主要介紹了c++11 新特性——智能指針使用的相關(guān)資料,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2021-02-02
  • C++中的類型查詢之探索typeid和type_info(推薦)

    C++中的類型查詢之探索typeid和type_info(推薦)

    C++ 是一種靜態(tài)類型語言,這意味著每個(gè)變量的類型在編譯時(shí)就已經(jīng)確定,在這篇技術(shù)分享中,我們將探討 C++ 中的 typeid 和 type_info,以及如何使用它們來獲取類型信息,需要的朋友可以參考下
    2024-05-05
  • C++ COM編程之什么是接口?

    C++ COM編程之什么是接口?

    這篇文章主要介紹了C++ COM編程之什么是接口?在C++中,可以使用抽象基類來實(shí)現(xiàn)COM接口,需要的朋友可以參考下
    2014-10-10
  • C語言之從字符數(shù)組中刪除特定的字符

    C語言之從字符數(shù)組中刪除特定的字符

    本篇文章主要介紹了從字符數(shù)組中刪除特定字符的實(shí)現(xiàn)方法,有需要的朋友可以參考下
    2015-07-07

最新評(píng)論

南京市| 辽阳市| 伊宁县| 姚安县| 辉县市| 拉孜县| 偃师市| 辉南县| 高唐县| 增城市| 西畴县| 高雄市| 河南省| 社会| 淅川县| 星座| 佛教| 大理市| 灵丘县| 长治县| 晋城| 教育| 皮山县| 绍兴县| 桦川县| 泾阳县| 河源市| 宣恩县| 唐河县| 嘉荫县| 江达县| 鲁山县| 保山市| 陈巴尔虎旗| 繁峙县| 天全县| 平谷区| 五原县| 贺州市| 凉城县| 景德镇市|