Qt串口通信開(kāi)發(fā)之QSerialPort模塊簡(jiǎn)單使用方法與實(shí)例
我這里主要是對(duì)串口類的簡(jiǎn)單使用,實(shí)現(xiàn)的功能是以讀寫(xiě)方式打開(kāi)串口,點(diǎn)擊發(fā)送數(shù)據(jù)按鈕將發(fā)送區(qū)的數(shù)據(jù)發(fā)送到緩沖區(qū),然后在接收區(qū)顯示出來(lái),界面如下:(源碼可以在這里下載)

這里使用了QSerialPort模塊提供的兩個(gè)類:QSerialPort類和QSerialPortInfo類,QSerialPort類提供了對(duì)串口的操作,QSerialPortInfo類提供了對(duì)串口信息的獲取。下面是主要代碼,包含了對(duì)串口類的簡(jiǎn)單使用。
首先,一定要在.pro文件中添加:QT += serialport
串口初始化如下:
/****************************串口初始化*****************************/
void MainWindow::initPort()
{
//讀取串口信息
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
qDebug()<<"Name:"<<info.portName();
qDebug()<<"Description:"<<info.description();
qDebug()<<"Manufacturer:"<<info.manufacturer();
//這里相當(dāng)于自動(dòng)識(shí)別串口號(hào)之后添加到了cmb,如果要手動(dòng)選擇可以用下面列表的方式添加進(jìn)去
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
//將串口號(hào)添加到cmb
ui->cmbPortName->addItem(info.portName());
//關(guān)閉串口等待人為(打開(kāi)串口按鈕)打開(kāi)
serial.close();
}
}
QStringList baudList;//波特率
QStringList parityList;//校驗(yàn)位
QStringList dataBitsList;//數(shù)據(jù)位
QStringList stopBitsList;//停止位
baudList<<"50"<<"75"<<"100"<<"134"<<"150"<<"200"<<"300"
<<"600"<<"1200"<<"1800"<<"2400"<<"4800"<<"9600"
<<"14400"<<"19200"<<"38400"<<"56000"<<"57600"
<<"76800"<<"115200"<<"128000"<<"256000";
ui->cmbBaudRate->addItems(baudList);
ui->cmbBaudRate->setCurrentIndex(12);
parityList<<"無(wú)"<<"奇"<<"偶";
parityList<<"標(biāo)志";
parityList<<"空格";
ui->cmbParity->addItems(parityList);
ui->cmbParity->setCurrentIndex(0);
dataBitsList<<"5"<<"6"<<"7"<<"8";
ui->cmbDataBits->addItems(dataBitsList);
ui->cmbDataBits->setCurrentIndex(3);
stopBitsList<<"1";
stopBitsList<<"1.5";
stopBitsList<<"2";
ui->cmbStopBits->addItems(stopBitsList);
ui->cmbStopBits->setCurrentIndex(0);
//設(shè)置按鈕可以被按下
ui->btnOpen->setCheckable(true);
}
這里通過(guò)遍歷所有串口將我們需要使用的串口添加到了combox中,如果想要手動(dòng)選擇可以將串口名稱通過(guò)列表的方式添加到combox中,到使用的時(shí)候再選擇。
串口設(shè)置如下:
/****************************串口設(shè)置******************************/
void MainWindow::on_btnOpen_clicked()
{
if(ui->btnOpen->text() == "打開(kāi)串口")
{
my_serialport = new QSerialPort(this);
//設(shè)置串口號(hào)
my_serialport->setPortName(ui->cmbPortName->currentText());
//以讀寫(xiě)方式打開(kāi)串口
if(my_serialport->open(QIODevice::ReadWrite))
{
//設(shè)置波特率
my_serialport->setBaudRate(ui->cmbBaudRate->currentText().toInt());
//設(shè)置數(shù)據(jù)位
my_serialport->setDataBits(QSerialPort::Data8);
//設(shè)置校驗(yàn)位
my_serialport->setParity(QSerialPort::NoParity);
//設(shè)置流控制
my_serialport->setFlowControl(QSerialPort::NoFlowControl);
//設(shè)置停止位
my_serialport->setStopBits(QSerialPort::OneStop);
//每秒讀一次
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(readComDataSlot()));
timer->start(1000);
setNonSelectable();
}
else
{
QMessageBox::about(NULL, "提示", "串口沒(méi)有打開(kāi)!");
return;
}
}
else
{
timer->stop();
setSelectable();
my_serialport->close();
}
}
這里是對(duì)串口的設(shè)置,需要先打開(kāi)串口才能設(shè)置串口參數(shù)。參數(shù)設(shè)置好之后就可以通過(guò)read()和write()函數(shù)進(jìn)行數(shù)據(jù)的讀寫(xiě),我這里用的是1秒的定時(shí)器來(lái)讀緩沖區(qū)的數(shù)據(jù)。
數(shù)據(jù)收發(fā)如下:
/****************************數(shù)據(jù)傳輸******************************/
void MainWindow::readComDataSlot()
{
//讀取串口數(shù)據(jù)
QByteArray readComData = my_serialport->readAll();
//將讀到的數(shù)據(jù)顯示到數(shù)據(jù)接收區(qū)的te中
if(readComData != NULL)
{
ui->teReceiveData->append(readComData);
}
//清除緩沖區(qū)
readComData.clear();
}
void MainWindow::on_btnSend_clicked()
{
//獲取發(fā)送區(qū)的數(shù)據(jù)
QString sendData = ui->teSendData->toPlainText();
QByteArray sendData_2 = sendData.toLatin1();
//寫(xiě)入緩沖區(qū)
my_serialport->write(sendData_2);
}
本文簡(jiǎn)單介紹了下Qt串口通信模塊QSerialPort簡(jiǎn)單使用方法與實(shí)例,更詳細(xì)的Qt串口通信模塊QSerialPort知識(shí)請(qǐng)查看下面的相關(guān)鏈接
相關(guān)文章
C語(yǔ)言解決字符串中插入和刪除某段字符串問(wèn)題
這篇文章主要介紹了C語(yǔ)言解決字符串中插入和刪除某段字符串問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
C++中指針的數(shù)據(jù)類型和運(yùn)算相關(guān)知識(shí)小結(jié)
這篇文章主要介紹了C++中指針的數(shù)據(jù)類型和運(yùn)算相關(guān)知識(shí)小結(jié),是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
C語(yǔ)言中宏和函數(shù)的9個(gè)區(qū)別詳解
C語(yǔ)言中的宏和函數(shù)是非常相似的,它們都可以完成類似的功能。本文為大家整理了C語(yǔ)言中宏和函數(shù)的9個(gè)區(qū)別,感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04
Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)請(qǐng)求
這篇文章主要為大家介紹了Qt中是如何實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)請(qǐng)求的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定幫助,感興趣的小伙伴可以了解一下2022-03-03
淺析Boost智能指針:scoped_ptr shared_ptr weak_ptr
雖然通過(guò)弱引用指針可以有效的解除循環(huán)引用,但這種方式必須在程序員能預(yù)見(jiàn)會(huì)出現(xiàn)循環(huán)引用的情況下才能使用,也可以是說(shuō)這個(gè)僅僅是一種編譯期的解決方案,如果程序在運(yùn)行過(guò)程中出現(xiàn)了循環(huán)引用,還是會(huì)造成內(nèi)存泄漏的2013-09-09

