<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了Qt實現串列埠助手的具體程式碼,供大家參考,具體內容如下
這是一個常見的串列埠助手佈局。要說有什麼不常見,大概就是傳送可以選擇編碼方式:GBK/UTF8
沒什麼難度,就是水磨工夫,一點點寫。容易錯處的地方都寫在程式碼註釋裡。
下面是 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); //新增資料位 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); //新增奇偶校驗位 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); //禁用傳送按鈕 ui->btnSend->setEnabled(false); ui->btnOpen->setStatusTip(tr("開啟/關閉串列埠")); ui->rdbGbk->setStatusTip("以GBK編碼傳送" ); ui->rdbUtf8->setStatusTip(tr("以UTF8編碼傳送")); } 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() != "關閉") { if( !ui->cbbPort->currentText().isNull() ) { ui->btnOpen->setText("關閉"); 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); } } //字串資料轉為HEX,16進位制形式。譬如將 「30」轉為「0」 bool StringToHex( QString &dst,const QString src ) { QStringList list = src.trimmed().split(QRegExp("t|n|rn|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轉為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 ; } //串列埠傳送 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資料格式錯誤,n資料形式類似: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會從下一行開始,所以先放入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); }
測試可以傳送和接收GK/UTF8編碼的資料。下圖是和ATK-XCOM通過虛擬串列埠互動。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45