QT5串口通信
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.运行
仔细按照步骤来,不会报错。特别是为控件命名的那一步要保证不出错。