Linux下QT5以上版本串口的最简单实现(测试可用)
1. 简介
简简单单一个串口,在Linux环境下踩了无数的雷。这里用最简单的方式实现串口通讯。
把串口的TX和RX短接,就可以收到我们发的数据了。
2. 查看串口名称
打开终端,输入命令行,看看现在设备上有的串口。看看你想用哪一个。
//查看串口名称
ls -l /dev/ttyS*
//终端输出
crw-rw---- 1 root dialout 4, 67 7月 28 08:51 /dev/ttyS1
crw-rw---- 1 root dialout 4, 67 7月 28 08:51 /dev/ttyS2
crw-rw---- 1 root dialout 4, 67 7月 28 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>