天天看点

Qt读写串口

Qt 对串口的操作封装在了 QSerialPort 中,关于它的具体函数及使用方法参考 这篇文章;

1 读取串口

  • 关于设备权限的问题

    Qt 打开串口时可能会失败,因为操作驱动设备需要 root 权限,为此,解决方法有两种:

    • 1 把对应的串口设备文件的所有权和组改成普通用户的,如:

      sudo chown xxx:xxx /dev/ttyF0

    • 2 把当前用户的组类别改成

      dialout

      (串口 tty 设备所在组为 dialout 组),命令:

      sudo gpasswd -a $USER dialout

  • 在.pro文件中进行声明
QT += serialport
           
  • 头文件
#include <QSerialPort>
#include <QSerialPortInfo>
//#include <QDebug>
           
  • 实例化 QSrerialPort
QSerialPort *serial=new QSerialPort
           
  • 寻找显示目前的所有串口信息
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        qDebug() << "Name : " << info.portName();
        qDebug() << "Description : " << info.description();
        qDebug() << "Manufacturer: " << info.manufacturer();
        qDebug() << "Serial Number: " << info.serialNumber();
        qDebug() << "System Location: " << info.systemLocation();
    }
           
  • 打开(关闭)串口
serial->setPortName("ttyF1"); // 串口名称
    serial->open(QIODevice::ReadOnly); // 打开失败会返回 false
    // serial->clear(); //清除缓存区
    // serial->close(); //关闭串口
           
  • 配置参数
s->setBaudRate(QSerialPort::Baud4800);
    s->setParity(QSerialPort::NoParity);
    s->setStopBits(QSerialPort::OneStop);
    //s->setFlowControl(QSerialPort::NoFlowControl);
    s->setFlowControl(QSerialPort::HardwareControl);
    s->setDataBits(QSerialPort::Data8);
           
  • 使用信号与槽读取串口
/***** 在头文件中声明该槽函数
private slots:
    void ReadData();
*******/ 
/***** 连接信号与槽
connect(s,&QSerialPort::readyRead,this,&MainWindow::ReadData);
******/
void MainWindow::ReadData()
{
    QByteArray buf;
    buf=s->readAll();
    if(!buf.isEmpty()) {
        QString str = buf;
        //std::cout  << str.toStdString() << std::endl;
        std::cout  << str.data() << std::endl;
        //qDebug()  << str;
    }
    buf.clear();
}
           

2 读取串口各管脚信号

串口的接头有两种,下图为“上公下母”:

Qt读写串口

以图中的“公头”为例,其各个管脚的含义:

管脚 简写 含义 输入/输出
1 DCD 数据载波检测 input
2 RxD 接收数据 input
3 TxD 发送数据 output
4 DTR 数据终端准备 output
5 GND
6 DSR 数据设备准备好 input
7 RTS 请求发送 output
8 CTS 清除发送 input
9 RI 震铃指示 input

如果要读取串口某个管脚的信号,可以使用

QSerialPort::PinoutSignals PinoutSignals()

,该函数以位图的格式返回引脚信号状态;具体的返回值请查看 QSerialPort::PinoutSignals 的枚举值;简单的使用例子:

QSerialPort::PinoutSignals m = s->pinoutSignals();
if (m & QSerialPort::ClearToSendSignal)
    qDebug() << " CTS ";
if (m & QSerialPort::DataSetReadySignal)
    qDebug() << " DSR ";
           

3 Ubuntu 串口调试助手

  • 安装
    sudo apt-get install cutecom
               
  • 打开
    cutecom
    
    
               

继续阅读