Linux下QT5以上版本串口的最简单实现(测试可用)

余生长醉 提交于 2020-08-04 12:31:24

Linux下QT5以上版本串口的最简单实现(测试可用)

1. 简介

简简单单一个串口,在Linux环境下踩了无数的雷。这里用最简单的方式实现串口通讯。
把串口的TX和RX短接,就可以收到我们发的数据了。

2. 查看串口名称

打开终端,输入命令行,看看现在设备上有的串口。看看你想用哪一个。

//查看串口名称
ls -l /dev/ttyS*

//终端输出
crw-rw---- 1 root dialout 4, 67 728 08:51 /dev/ttyS1
crw-rw---- 1 root dialout 4, 67 728 08:51 /dev/ttyS2
crw-rw---- 1 root dialout 4, 67 728 08:51 /dev/ttyS3

3. QT代码

QT5以上的版本,可以使用“serialport”非常方便。
在.pro文件中加入一句话

QT       += serialport

简单说,串口总共分三步:
第一步初始化

    myCom = new QSerialPort();//这个在.h中定义了 QSerialPort *myCom;//声明对象
    myCom->setPortName("/dev/ttyS3");//串口的名称
    myCom->open(QIODevice::ReadWrite);//读写模式
    myCom->setBaudRate(QSerialPort::Baud9600);//波特率
    myCom->setBaudRate(QSerialPort::Data8);//8位数据
    myCom->setParity(QSerialPort::NoParity);//无校验位
    myCom->setStopBits(QSerialPort::OneStop);//1位停止
    myCom->setFlowControl(QSerialPort::NoFlowControl);//无数据流控制

    connect(myCom,SIGNAL(readyRead()),this,SLOT(getdata()));//连接接收的槽函数

第二步发送

void MainWindow::on_pushButton_clicked()
{
    char sd[2];
    sd[0]='O';
    sd[1]='K';
    qWarning()<<"OK";
    myCom->write(sd,2);//发送两位
}

第三步接收

void MainWindow::getdata()
{
    QByteArray buf_data;            //接收数据,qByteArray是最常用的类
    buf_data = myCom->readAll();    //接收数据
    qWarning()<<buf_data.size();    //打印数据长度
    qWarning()<<buf_data.data();    //打印数据
}

界面,就一个按钮发送用。
在这里插入图片描述
输出结果:
我们需要把串口的TX和RX短接,就可以收到我们发的数据了。
在这里插入图片描述
这里的意思是收到两次数据,第一次一个’O’,第二次一个’K’。
但是我们发送的是两位数据“OK”。
出现这种情况是因为程序运行速度远远超过发送的速度。
第二个数没到呢,第一个数据已经处理完了。
这里就需要协议了,定义数据的长度和起始位和停止位,然后整合数据。
但是能收到数据就表示串口好使了。









4. 存在的问题的问题

问题1:上文已经提到的数据断开的问题。

需要协议,定义数据的长度和起始位和停止位,然后整合数据。

问题2:权限不足有可能导致串口打不开。

部分linux系统的串口权限只开放给root,需要用命令行打开QT再运行程序。

su root
密码://我的是00000000

/usr/bin/qtcreator

问题3:qWarning的使用

再linux下,qDebug()是用不了的。
只能使用qWarning,目前来看功能完全一样,头文件是:

#include <QDebug>

工程下载链接

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!