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 读取串口各管脚信号

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值