QT5串口通信——基础篇

这里介绍一下,用QT5实现串口通信的应用程序。

新建工程,选QWidget为基类,如下图所示。


在.pro文件,中添加QT+=serialport

编辑界面文件,如下图所示。(所有控件名都要重新设置)


右击你的控件,如:按键,再点转到槽,就可以跳到该按键的槽函数。


在widget.h中添加头文件,以及槽函数和私有的串口类的声明

#include <QtSerialPort/QSerialPort>
 
private slots:
    void on_openPortBtn_clicked();	//利用“转到槽添加的槽函数声明
    void read_Com();			//手动添加的槽函数声明,用于读出串口缓冲区的内容
    void on_SendBtn_clicked();		//利用“转到槽添加的槽函数声明
private:
    Ui::Widget *ui;
    QSerialPort serial;			//声明串口类


main.cpp可以不改,然后,在widget.cpp中添加槽函数的定义

void Widget::on_openPortBtn_clicked()
{
    if(ui->portNameComboBox->isEnabled())
    {
        ui->openPortBtn->setText("ClosePort");		//按下“OpenPort后,按键显示为“ClosePort”
        ui->portNameComboBox->setDisabled(true);	//按下“OpenPort后,禁止再修改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("OpenPort");		//按下“ClosePort后,按键显示为“OpenPort
        ui->portNameComboBox->setEnabled(true);		//按下“ClosePort后,COM口可被修改
        serial.close();					//关串口
    }
}
 
void Widget::read_Com()
{
    QByteArray temp=serial.read(1);//在缓冲区中读一个byte
    if(!temp.isEmpty())//如果读到的数据不为空
    {
    ui->recvTextBrowser->insertPlainText("0x");
    ui->recvTextBrowser->insertPlainText(temp.toHex());//显示接收到的数据的十六进制
    ui->recvTextBrowser->insertPlainText(" ");
    }
}
 
void Widget::on_SendBtn_clicked()
{
    serial.write(ui->sendTextEdit->toPlainText().toLatin1());//以ASCII码的形式通过串口发送出去。
}

最终效果如下图所示:


因为QT5没有QString转十六进制的函数,要自己写,所以上图中,PC机发送5,而FPGA显示为35(即ASCII码5的十六进制数),而接收过来的数据是QByteArray,这个可以直接转成十六进制,所以上图中,FPGA发送8,PC机接收到0x08。

BTW:该程序只用一个线程,也就是说,你让它一边接收数据,一边画出拆线图,是不行的。要实现这种功能,要用到多线程的QThread类。

该程序只是演示最简单的串口发收功能,还远远达不到工业级的要求。

工业级的要求是:收发双方都要加上CRC检验、重传机制、出错/异常处理、甚至是总线仲裁,才能构成一套完备的通信程序。当然,界面也不能做得太难看,不然客户每次用的时候,都觉得恶心。


  • 11
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
QT5串口编程可以用于编写简单的上位机,通过串口与下位机进行通信。下面是一个简单的上位机编写示例: 首先,要在QT项目中加入串口模块,可以通过在.pro文件中加入以下代码实现: ``` QT += serialport ``` 接下来,创建一个新的类,命名为SerialPort,继承自QObject,并添加以下代码: ```cpp #include "serialport.h" SerialPort::SerialPort(QObject *parent) : QObject(parent) { serial = new QSerialPort(this); connect(serial, &QSerialPort::readyRead, this, &SerialPort::readData); } void SerialPort::openPort(QString portName, qint32 baudRate) { serial->setPortName(portName); serial->setBaudRate(baudRate); if(serial->open(QIODevice::ReadWrite)) { qDebug() << "Serial port is open"; } else { qDebug() << "Serial port failed to open"; } } void SerialPort::closePort() { if(serial->isOpen()) { serial->close(); qDebug() << "Serial port is closed"; } } void SerialPort::readData() { QByteArray data = serial->readAll(); qDebug() << "Received data: " << data; // 在这里可以对接收到的数据进行处理 } void SerialPort::writeData(QByteArray data) { if(serial->isOpen()) { serial->write(data); qDebug() << "Sent data: " << data; } else { qDebug() << "Serial port is not open"; } } ``` 在主窗口中,可以使用SerialPort类的实例来控制串口的打开、关闭和数据的读写,可以通过按钮来触发相应的操作。下面是一个简单的主窗口实现: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); serialPort = new SerialPort(this); connect(ui->openButton, &QPushButton::clicked, this, &MainWindow::openPort); connect(ui->closeButton, &QPushButton::clicked, this, &MainWindow::closePort); connect(ui->sendButton, &QPushButton::clicked, this, &MainWindow::sendData); } MainWindow::~MainWindow() { delete ui; } void MainWindow::openPort() { QString portName = ui->portComboBox->currentText(); qint32 baudRate = ui->baudRateComboBox->currentText().toInt(); serialPort->openPort(portName, baudRate); } void MainWindow::closePort() { serialPort->closePort(); } void MainWindow::sendData() { QString data = ui->sendLineEdit->text(); serialPort->writeData(data.toUtf8()); ui->sendLineEdit->clear(); } ``` 在QT设计器中,可以创建一个MainWindow窗口,包含一个QComboBox用于选择串口号,一个QComboBox用于选择波特率,一个QLineEdit用于输入发送的数据,以及几个QPushButton用于触发相应的操作。 以上就是一个简单的QT5串口编程的上位机实现,你可以根据具体的需求进行进一步的修改和扩展。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值