QT5串口通信

                                              Qt串口通信

1.新建工程,基类选择Qwidget

New Project-----Application-----Qt Widget Application-----choose------名称栏填写QtComm(路径不要有中文)--------下一步------下一步-----基类下拉框选择Qwidget------下一步----完成。

2.在QtComm.pro中加入

QT       += serialport

QT5串口通信

3.在界面ui文件中添加控件:2个Push Button、3个Label、2个Text Edit、、1个ConboBox

如下:

QT5串口通信

 

分别为他们命名:

发送: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.运行

仔细按照步骤来,不会报错。特别是为控件命名的那一步要保证不出错。