Qt串口通信
1.新建工程,基類選擇Qwidget
New Project-----Application-----Qt Widget Application-----choose------名稱欄填寫QtComm(路徑不要有中文)--------下一步------下一步-----基類下拉框選擇Qwidget------下一步----完成。
2.在QtComm.pro中加入
QT += serialport
3.在界面ui文件中添加控件:2個Push Button、3個Label、2個Text Edit、、1個ConboBox
如下:
分別爲他們命名:
發送:SendBtn
打開串口:openPortBtn
發送窗口:sendTextEdit
接收窗口:recvTextEdit
串口下拉選擇控件:portNameComboBox
雙擊串口下拉選擇控件,點擊左下角+號將串口名寫上。(大寫COM1、COM2...)
4.右鍵發送和打開串口按鈕,選擇轉到槽函數。
這時,Qt會自動在Widget.cpp中添加響應的槽函數。
打開Widget.h,Qt在這裏自動的爲.cpp中的兩個函數進行了聲明,綠色部分。
4.1在widget.h中添加頭文件,陰影部分。以及槽函數和私有的串口類的聲明,紅色部分
#include <QtSerialPort/QSerialPort>
private slots:
void on_openPortBtn_clicked(); //利用“轉到槽”添加的槽函數聲明
void read_Com(); //手動添加的槽函數聲明,用於讀出串口緩衝區的內容
void on_SendBtn_clicked(); //利用“轉到槽”添加的槽函數聲明
4.2在private中聲明串口類,綠色部分
private:
Ui::Widget *ui;
QSerialPort serial; //聲明串口類
4.3在widget.cpp中添加槽函數的定義,藍色部分直接複製粘貼
void Widget::on_ openPortBtn _clicked() { if(ui->portNameComboBox->isEnabled()) { ui->openPortBtn->setText("關閉串口"); //按下“打開串口”後,按鍵顯示爲“關閉串口” ui->portNameComboBox->setDisabled(true); //按下“打開串口”後,禁止再修改COM口 serial.setPortName(ui->portNameComboBox->currentText()); //設置COM口 serial.setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//設置波特率和讀寫方式 serial.setDataBits(QSerialPort::Data8); //數據位爲8位 serial.setFlowControl(QSerialPort::NoFlowControl);//無流控制 serial.setParity(QSerialPort::NoParity); //無校驗位 serial.setStopBits(QSerialPort::OneStop); //一位停止位 serial.close(); //先關串口,再打開,可以保證串口不被其它函數佔用。 if(serial.open(QIODevice::ReadWrite)) //以可讀寫的方式打開串口 { connect(&serial,SIGNAL(readyRead()),this,SLOT(read_Com())); //把串口的readyRead()信號綁定到read_Com()這個槽函數上 } } else { ui->openPortBtn->setText("打開串口"); //按下“關閉串口”後,按鍵顯示爲“打開串口” ui->portNameComboBox->setEnabled(true); //按下“關閉串口”後,COM口可被修改
serial.close(); //關串口 } } void Widget::read_Com() { QByteArray temp=serial.read(1);//在緩衝區中讀一個byte if(!temp.isEmpty())//如果讀到的數據不爲空 { QByteArray temp=serial.readAll();//讀緩衝區 if(!temp.isEmpty())//如果讀到的數據不爲空 { ui->recvTextEdit->clear();//先清空顯示窗口再顯示,可以達到實時刷新顯示的目的 ui->recvTextEdit->insertPlainText(temp);//這裏別用append()是添加一個新行顯示 } temp.clear(); } void Widget::on_Send_clicked() { serial.write(ui->sendTextEdit->toPlainText().toLatin1());//以ASCII碼的形式通過串口發送出去。 }
5.運行
仔細按照步驟來,不會報錯。特別是爲控件命名的那一步要保證不出錯。