柚子快報(bào)激活碼778899分享:開發(fā)語言 c++ QT串口收發(fā)
柚子快報(bào)激活碼778899分享:開發(fā)語言 c++ QT串口收發(fā)
QT串口收發(fā)
串口掃描配置串口信息設(shè)置串口名稱設(shè)置波特率設(shè)置數(shù)據(jù)位設(shè)置奇偶校驗(yàn)設(shè)置停止位設(shè)置流控制設(shè)置讀取數(shù)據(jù)的緩存大小打開串口串口打開并配置代碼
串口接收數(shù)據(jù)串口發(fā)送數(shù)據(jù)串口關(guān)閉offAndOn自定義函數(shù),使comboBox不可再選
源碼:
串口掃描
將串口模塊添加到工程中 在.pro文件中添加serialport 用到的頭文件:
#include
#include
QSerialPort類提供訪問串口的功能,還可以通過QSerialPortInfo類獲取可用串口的信息。 QSerialPortInfo類允許枚舉系統(tǒng)中所有串口的信息,包括串口名稱、系統(tǒng)位置、描述和制造商。 QSerialPortInfo::availablePorts();返回系統(tǒng)上可用串口的列表。
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
//這里只是臨時(shí)讀取可用串口不要在堆區(qū)直接開辟空間
QSerialPort port;
port.setPort(info);
//以可讀可寫的方式打開(臨時(shí)打開,掃描可用串口)
if(port.open(QIODevice::ReadWrite))
{
//將掃描到的可用串口寫入到comboBox里
ui->comboBox->addItem(port.portName());
//關(guān)閉串口
port.close();
}
}
foreach(variable, container)”可以看到,foreach有兩個(gè)參數(shù):
container:容器,即被遍歷的對象
variable:當(dāng)前元素,即遍歷container過程中,當(dāng)前的那個(gè)元素
聲明QSerialPort成員變量 定義指針變量,用來承接在堆區(qū)開辟的對象,使之在全局范圍內(nèi)可用 在主窗口中實(shí)例化串口對象,和對可用串口進(jìn)行掃描
配置串口信息
通過QSerialPort類型定義的串口對象 對串口參數(shù)設(shè)置 配置信息主要是在串口打開時(shí)設(shè)置的,所以我們可以設(shè)置在串口打開按鈕槽函數(shù)里面
設(shè)置串口名稱
void QSerialPort::setPortName(const QString &name)
//ui->comboBox->currentText()//是comboBox當(dāng)前的文本內(nèi)容
m_port->setPortName(ui->comboBox->currentText());
設(shè)置波特率
setBaudRate(qint32 baudRate, Directions directions = AllDirections)
baudRate:為int類型 的波特率
m_port->setBaudRate(ui->comboBox_2->currentText().toInt());
//ui->comboBox_2->currentText().toInt()//將comboBox_2當(dāng)前文本內(nèi)容轉(zhuǎn)換為int
設(shè)置數(shù)據(jù)位
setDataBits(DataBits dataBits)
DataBits的類型為:
//comboBox_4數(shù)據(jù)位comboBox
//設(shè)置數(shù)據(jù)位
switch (ui->comboBox_4->currentText().toInt())
{
case 8:
m_port->setDataBits(QSerialPort::Data8);
break;
case 7:
m_port->setDataBits(QSerialPort::Data7);
break;
case 6:
m_port->setDataBits(QSerialPort::Data6);
break;
case 5:
m_port->setDataBits(QSerialPort::Data5);
break;
}
設(shè)置奇偶校驗(yàn)
在串口通信中一種簡單的檢錯(cuò)方式。有四種檢錯(cuò)方式:偶、奇、高和低。當(dāng)然沒有校驗(yàn)位也是可以的。
bool setParity(Parity parity)
if(ui->comboBox_5->currentText() == tr("無"))
m_port->setParity(QSerialPort::NoParity);
else if(ui->comboBox_5->currentText() == tr("奇校驗(yàn)"))
m_port->setParity(QSerialPort::EvenParity);
else if(ui->comboBox_5->currentText() == tr("偶校驗(yàn)"))
m_port->setParity(QSerialPort::OddParity);
else if(ui->comboBox_5->currentText() == tr("空格"))
m_port->setParity(QSerialPort::SpaceParity);
else if(ui->comboBox_5->currentText() == tr("標(biāo)記"))
m_port->setParity(QSerialPort::MarkParity);
設(shè)置停止位
bool setStopBits(StopBits stopBits)
if(ui->comboBox_3->currentText() == tr("1"))
m_port->setStopBits(QSerialPort::OneStop);
else if(ui->comboBox_3->currentText() == tr("1.5"))
m_port->setStopBits(QSerialPort::OneAndHalfStop);
else if(ui->comboBox_3->currentText() == tr("2"))
m_port->setStopBits(QSerialPort::TwoStop);
設(shè)置流控制
bool setFlowControl(FlowControl flowControl)
m_port->setFlowControl(QSerialPort::NoFlowControl); //設(shè)置為無流控制
設(shè)置讀取數(shù)據(jù)的緩存大小
它的大小決定了串口收到數(shù)據(jù)后可以緩存的數(shù)據(jù)的大小,如果長時(shí)間不將數(shù)據(jù)從緩沖區(qū)取出來,會(huì)出現(xiàn)溢出丟數(shù)據(jù)的情況。所以這個(gè)緩存的大小可以根據(jù)實(shí)際的通信速度和數(shù)據(jù)量進(jìn)行設(shè)置。
m_port->setReadBufferSize(40960);
打開串口
ReadWrite//可讀可寫
m_serialPort->open(QIODevice);
參數(shù)可以設(shè)置串口為只讀、只寫、讀寫三種方式。
串口打開并配置代碼
這一過程我主要在串口打開按鈕槽函數(shù)完成的
m_port->setBaudRate(ui->comboBox_2->currentText().toInt());//設(shè)置波特率
m_port->setPortName(ui->comboBox->currentText());
if(m_port->open(QIODevice::ReadWrite))
{
//設(shè)置數(shù)據(jù)位
switch (ui->comboBox_4->currentText().toInt())
{
case 8:
m_port->setDataBits(QSerialPort::Data8);
break;
case 7:
m_port->setDataBits(QSerialPort::Data7);
break;
case 6:
m_port->setDataBits(QSerialPort::Data6);
break;
case 5:
m_port->setDataBits(QSerialPort::Data5);
break;
}
//設(shè)置停止位
if(ui->comboBox_3->currentText() == tr("1"))
m_port->setStopBits(QSerialPort::OneStop);
else if(ui->comboBox_3->currentText() == tr("1.5"))
m_port->setStopBits(QSerialPort::OneAndHalfStop);
else if(ui->comboBox_3->currentText() == tr("2"))
m_port->setStopBits(QSerialPort::TwoStop);
//設(shè)置校驗(yàn)位
if(ui->comboBox_5->currentText() == tr("無"))
m_port->setParity(QSerialPort::NoParity);
else if(ui->comboBox_5->currentText() == tr("奇校驗(yàn)"))
m_port->setParity(QSerialPort::EvenParity);
else if(ui->comboBox_5->currentText() == tr("偶校驗(yàn)"))
m_port->setParity(QSerialPort::OddParity);
else if(ui->comboBox_5->currentText() == tr("空格"))
m_port->setParity(QSerialPort::SpaceParity);
else if(ui->comboBox_5->currentText() == tr("標(biāo)記"))
m_port->setParity(QSerialPort::MarkParity);
offAndOn(false);
m_port->setFlowControl(QSerialPort::NoFlowControl); //設(shè)置為無流控制
m_port->setReadBufferSize(40960);
}
else {
qDebug() << "串口打開失敗";
}
串口接收數(shù)據(jù)
串口接收數(shù)據(jù) 是通過信號readyRead信號,接收串口數(shù)據(jù)
信號:readyRead信號
//設(shè)置串口監(jiān)聽
connect(m_port,SIGNAL(readyRead()),this,SLOT(ReadData()));
//ReadData() //該槽函數(shù)需要用戶自己完成
設(shè)置接收監(jiān)聽 checkBox為: textEdit為
void Widget::ReadData()
{
//關(guān)閉串口
QByteArray arr;
//判斷串口接收方式
if(ui->checkBox->checkState())
{
arr = m_port->readAll().toHex();//將數(shù)據(jù)轉(zhuǎn)換成16進(jìn)制
}
else
{
arr = m_port->readAll();
}
ui->textEdit->append(arr);//將數(shù)據(jù)打印到textEdit
}
串口發(fā)送數(shù)據(jù)
textEdit_2為: checkBox_2為: checkBox_3為:
QByteArray Data_1;
//獲取輸入窗口sendData的數(shù)據(jù)
QString Data = ui->textEdit_2->toPlainText();
if(ui->checkBox_3->checkState())
{
Data+='\r';Data+='\n';
}
if(ui->checkBox_2->checkState())
{
Data_1 = QByteArray::fromHex(Data.toLatin1().data());//按十六進(jìn)制編碼發(fā)送
}
else
{
Data_1 = Data.toUtf8();//轉(zhuǎn)換成utf8格式的字節(jié)流發(fā)送
}
// 寫入發(fā)送緩存區(qū)
m_port->write(Data_1);
串口關(guān)閉
關(guān)閉應(yīng)寫在關(guān)閉槽函數(shù)中
m_port->close();
offAndOn(true);//自定義函數(shù),
offAndOn自定義函數(shù),使comboBox不可再選
void Widget::offAndOn(bool status)
{
ui->comboBox->setEnabled(status);
ui->comboBox_2->setEnabled(status);
ui->comboBox_3->setEnabled(status);
ui->comboBox_4 ->setEnabled(status);
ui->comboBox_5 ->setEnabled(status);
}
status false不可選 true可選
ui->comboBox->clear(); //清空comboBox
源碼:
鏈接:https://pan.baidu.com/s/1zgz6evCmnVrMW0CzBcjkYQ?pwd=2178 提取碼:2178
柚子快報(bào)激活碼778899分享:開發(fā)語言 c++ QT串口收發(fā)
相關(guān)鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。