1. 程式人生 > 其它 >qt實現ubuntu下使用模擬串列埠進行虛擬機器與本機串列埠收發除錯

qt實現ubuntu下使用模擬串列埠進行虛擬機器與本機串列埠收發除錯

本練習適合剛接觸QT的小夥伴,大佬略過。

先上成果圖:

 

首先使用串列埠模擬工具模擬出兩個虛擬串口出來:

 

 本機com1虛擬機器com2,將虛擬機器的串列埠開啟設定為com2:

 

然後進入Linux終端中檢視目前插入裝置的資訊:

dmesg |grep ttys*

 

 接著將裝置許可權改為777(任何使用者可讀可寫可執行,我這邊是已知ttyS1是com2口,如果不知道自己挨個試一下即可。)

sudo chmod 777 /dev/ttyS1

最後附上部分qt程式碼:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include 
<QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); SerialPort = new QSerialPort(); serialInit(); connect(SerialPort,SIGNAL(readyRead()),this,SLOT(serialRead())); } MainWindow::~MainWindow() { delete ui; }
//介面載入時重新整理介面相應控制元件資訊 void MainWindow::serialInit() { ui->cboPort->clear(); //讀取串列埠資訊 foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { // if(!info.portName().contains("USB")) // continue; qDebug() << info.portName();
//自動讀取串列埠號新增到埠下拉框中 QSerialPort serial; serial.setPort(info); if(serial.open(QIODevice::ReadWrite)) { qDebug() << "open success"; ui->cboPort->addItem(info.portName()); // serial.close(); } else { qDebug() << "open fail"; } QStringList baudList;//波特率 QStringList parityList;//奇偶校驗 QStringList dataBitList;//資料位 QStringList stopBitList;//停止位 baudList<<"1200"<<"2400"<<"4800"<<"9600" <<"14400"<<"19200"<<"38400"<<"56000" <<"57600"<<"115200"; ui->cboBaud->addItems(baudList); ui->cboBaud->setCurrentIndex(3); parityList<<("None")<<("Odd")<<("Even"); ui->cboVerify->addItems(parityList); } } //收到介面訊號時執行的方法 void MainWindow::serialRead() { QString strBuffer; //從緩衝區中讀取資料 QByteArray buffer = SerialPort->readAll(); if(!buffer.isEmpty())//非空說明有資料接受 { //轉換成16進位制大寫 QString str = buffer.toHex().data(); str = str.toUpper(); //一個16進位制佔4位,8位為一位元組,所以每兩位16進制空一格 for(int i=0;i<str.length();i+=2) { qDebug() << "str.Length"+str.length(); qDebug() << "str"+str; QString strTem = str.mid(i,2); strBuffer +=strTem; strBuffer +=" "; } //讀取之前顯示資料 QString receive = ui->txtRec->toPlainText(); //清空顯示 ui->txtRec->clear(); receive += QString(strBuffer); ui->txtRec->appendPlainText(receive); } buffer.clear(); } void MainWindow::on_btnOpenSerial_clicked() { //開啟串列埠 if(ui->btnOpenSerial->text() == "開啟串列埠") { //設定串列埠號 SerialPort->setPortName(ui->cboPort->currentText()); //開啟串列埠 if(SerialPort->open(QIODevice::ReadWrite)) { //設定波特率 SerialPort->setBaudRate(ui->cboBaud->currentText().toInt()); //設定資料位數 switch(ui->cboNumBit->currentIndex()) { case 5:SerialPort->setDataBits(QSerialPort::Data5);break; case 6:SerialPort->setDataBits(QSerialPort::Data6);break; case 7:SerialPort->setDataBits(QSerialPort::Data7);break; case 8:SerialPort->setDataBits(QSerialPort::Data8);break; default:break; } //設定奇偶 switch(ui->cboVerify->currentIndex()) { case 0:SerialPort->setParity(QSerialPort::NoParity);break; case 1:SerialPort->setParity(QSerialPort::OddParity);break; case 2:SerialPort->setParity(QSerialPort::EvenParity);break; default:break; } //設定流控制 SerialPort->setFlowControl(QSerialPort::NoFlowControl); //設定停止位 switch(ui->cboStop->currentIndex()) { case 1:SerialPort->setStopBits(QSerialPort::OneStop); case 2:SerialPort->setStopBits(QSerialPort::TwoStop); default:break; } } //打不開串列埠提示報錯 else { QMessageBox::about(NULL,"提示","串列埠無法開啟\r\n不存在或已被佔用"); return ; } ui->btnOpenSerial->setText("關閉串列埠"); //下拉選單控制元件使能 ui->cboBaud->setEnabled(false); ui->cboNumBit->setEnabled(false); ui->cboPort->setEnabled(false); ui->cboStop->setEnabled(false); ui->cboVerify->setEnabled(false); //傳送按鍵使能 ui->btnSend->setEnabled(true); } else { SerialPort->close(); ui->btnOpenSerial->setText("開啟串列埠"); //下拉按鍵使能 ui->cboBaud->setEnabled(true); ui->cboNumBit->setEnabled(true); ui->cboPort->setEnabled(true); ui->cboStop->setEnabled(true); ui->cboVerify->setEnabled(true); //傳送按鍵使能 ui->btnSend->setEnabled(false); } } void MainWindow::on_btnSend_clicked() { QByteArray data; //獲取輸入視窗sendData的資料 QString strData = ui->txtSend->toPlainText(); data = QByteArray::fromHex(strData.toLatin1().data()); //寫入傳送緩衝區 SerialPort->write(data); }