您好,登錄后才能下訂單哦!
怎么在Qt中使用QSerialPort模塊實現(xiàn)串口通信開發(fā)?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
首先,一定要在.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); }
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。