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

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

1. 简介

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

2. 查看串口名称

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

1//查看串口名称 2ls -l /dev/ttyS* 3 4//终端输出 5crw-rw---- 1 root dialout 4, 67 728 08:51 /dev/ttyS1 6crw-rw---- 1 root dialout 4, 67 728 08:51 /dev/ttyS2 7crw-rw---- 1 root dialout 4, 67 728 08:51 /dev/ttyS3

3. QT代码

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

QT       += serialport

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

1 myCom = new QSerialPort();//这个在.h中定义了 QSerialPort *myCom;//声明对象 2 myCom->setPortName("/dev/ttyS3");//串口的名称 3 myCom->open(QIODevice::ReadWrite);//读写模式 4 myCom->setBaudRate(QSerialPort::Baud9600);//波特率 5 myCom->setBaudRate(QSerialPort::Data8);//8位数据 6 myCom->setParity(QSerialPort::NoParity);//无校验位 7 myCom->setStopBits(QSerialPort::OneStop);//1位停止 8 myCom->setFlowControl(QSerialPort::NoFlowControl);//无数据流控制 9 10 connect(myCom,SIGNAL(readyRead()),this,SLOT(getdata()));//连接接收的槽函数

第二步发送

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

第三步接收

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

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

4. 存在的问题的问题

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

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

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

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

su root
密码://我的是00000000

/usr/bin/qtcreator

问题3:qWarning的使用

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

#include <QDebug>

工程下载链接

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap

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