轉載自 http://blog.csdn.net/zbw1185/article/details/51496663
因為工作需要,現在正在學習Qt的串口通信。Qt4的話需要使用第三方類,使用起來也非常簡單,只需要把對應的文件添加到自己的項目中就可以了,我參考的是Qt論壇上的demo,劉大師和yafei的demo都非常詳細,網上都可以下載到。不過,Qt5添加了串口類,使用起來就更方便了。
我這里主要是對串口類的簡單使用,實現的功能是以讀寫方式打開串口,點擊發送數據按鈕將發送區的數據發送到緩沖區,然后在接收區顯示出來,界面如下:(源碼可以在
這里下載)

這里使用了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;//數據位
- 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());
- //設置數據位
- 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();
- }
- }
這里是對串口的設置,需要先打開串口才能設置串口參數。參數設置好之后就可以通過read()和write()函數進行數據的讀寫,我這里用的是1秒的定時器來讀緩沖區的數據。
數據收發如下:
- /****************************數據傳輸******************************/
- void MainWindow::readComDataSlot()
- {
- //讀取串口數據
- QByteArray readComData = my_serialport->readAll();
- //將讀到的數據顯示到數據接收區的te中
- if(readComData != NULL)
- {
- ui->teReceiveData->append(readComData);
- }
- //清除緩沖區
- readComData.clear();
- }
- void MainWindow::on_btnSend_clicked()
- {
- //獲取發送區的數據
- QString sendData = ui->teSendData->toPlainText();
- QByteArray sendData_2 = sendData.toLatin1();
- //寫入緩沖區
- my_serialport->write(sendData_2);
- }
