Qt串口通信開發(fā)之QSerialPort模塊簡單使用方法與實例
我這里主要是對串口類的簡單使用,實現(xiàn)的功能是以讀寫方式打開串口,點擊發(fā)送數(shù)據(jù)按鈕將發(fā)送區(qū)的數(shù)據(jù)發(fā)送到緩沖區(qū),然后在接收區(qū)顯示出來,界面如下:(源碼可以在這里下載)
這里使用了QSerialPort模塊提供的兩個類:QSerialPort類和QSerialPortInfo類,QSerialPort類提供了對串口的操作,QSerialPortInfo類提供了對串口信息的獲取。下面是主要代碼,包含了對串口類的簡單使用。
首先,一定要在.pro文件中添加:QT += serialport
串口初始化如下:
/****************************串口初始化*****************************/ void MainWindow::initPort() { //讀取串口信息 foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { qDebug()<<"Name:"<<info.portName(); qDebug()<<"Description:"<<info.description(); qDebug()<<"Manufacturer:"<<info.manufacturer(); //這里相當于自動識別串口號之后添加到了cmb,如果要手動選擇可以用下面列表的方式添加進去 QSerialPort serial; serial.setPort(info); if(serial.open(QIODevice::ReadWrite)) { //將串口號添加到cmb ui->cmbPortName->addItem(info.portName()); //關閉串口等待人為(打開串口按鈕)打開 serial.close(); } } QStringList baudList;//波特率 QStringList parityList;//校驗位 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<<"無"<<"奇"<<"偶"; parityList<<"標志"; 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); //設置按鈕可以被按下 ui->btnOpen->setCheckable(true); }
這里通過遍歷所有串口將我們需要使用的串口添加到了combox中,如果想要手動選擇可以將串口名稱通過列表的方式添加到combox中,到使用的時候再選擇。
串口設置如下:
/****************************串口設置******************************/ void MainWindow::on_btnOpen_clicked() { if(ui->btnOpen->text() == "打開串口") { my_serialport = new QSerialPort(this); //設置串口號 my_serialport->setPortName(ui->cmbPortName->currentText()); //以讀寫方式打開串口 if(my_serialport->open(QIODevice::ReadWrite)) { //設置波特率 my_serialport->setBaudRate(ui->cmbBaudRate->currentText().toInt()); //設置數(shù)據(jù)位 my_serialport->setDataBits(QSerialPort::Data8); //設置校驗位 my_serialport->setParity(QSerialPort::NoParity); //設置流控制 my_serialport->setFlowControl(QSerialPort::NoFlowControl); //設置停止位 my_serialport->setStopBits(QSerialPort::OneStop); //每秒讀一次 timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(readComDataSlot())); timer->start(1000); setNonSelectable(); } else { QMessageBox::about(NULL, "提示", "串口沒有打開!"); return; } } else { timer->stop(); setSelectable(); my_serialport->close(); } }
這里是對串口的設置,需要先打開串口才能設置串口參數(shù)。參數(shù)設置好之后就可以通過read()和write()函數(shù)進行數(shù)據(jù)的讀寫,我這里用的是1秒的定時器來讀緩沖區(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(); //寫入緩沖區(qū) my_serialport->write(sendData_2); }
本文簡單介紹了下Qt串口通信模塊QSerialPort簡單使用方法與實例,更詳細的Qt串口通信模塊QSerialPort知識請查看下面的相關鏈接
相關文章
Qt數(shù)據(jù)庫應用之實現(xiàn)通用數(shù)據(jù)庫請求
這篇文章主要為大家介紹了Qt中是如何實現(xiàn)通用數(shù)據(jù)庫請求的,文中的示例代碼講解詳細,對我們學習Qt有一定幫助,感興趣的小伙伴可以了解一下2022-03-03淺析Boost智能指針:scoped_ptr shared_ptr weak_ptr
雖然通過弱引用指針可以有效的解除循環(huán)引用,但這種方式必須在程序員能預見會出現(xiàn)循環(huán)引用的情況下才能使用,也可以是說這個僅僅是一種編譯期的解決方案,如果程序在運行過程中出現(xiàn)了循環(huán)引用,還是會造成內存泄漏的2013-09-09