Qt 谈一谈串口serialport

前言:

最近一段时间在做有关串口通讯的Qt项目,在ubuntu 和 window两个平台上都有接触。在这中秋佳节即将来临之际,也得空写点关于这方面的心得,算是一个记录笔记吧。

Qt官方有关串口类的介绍,说的很明白,Since: Qt5.1,从5.1版本才引进的QSerialPort 类。

Qt 谈一谈串口serialport_第1张图片

那么要是qt5版本之前的平台要怎么写串口功能呢?

qt5之前

需要引入第三方qextserialport类,而这对于linux和window平台又有所不同。

官方地址:https://qextserialport.github.io/

下载地址:https://github.com/qextserialport/qextserialport

window平台:

在我们的项目中加入:

C文件qextserialbase.cpp         头文件qextserialbase.h

C文件qextserialport.cpp          头文件qextserialport.h,

C文件win_qextserialport.cpp   头文件win_qextserialport.h

使用时:

头文件声明类对象
QextSerialPort *myCom;

 打开并配置串口,举例:

    //选择串口号
    QString portName = ui->PortNamecomboBox->currentText();
    myCom = new QextSerialPort(portName);

    //串口数据读取连接
    connect(myCom, SIGNAL(readyRead()), this, SLOT(ReadMyCom()));

    //设置波特率
    myCom->setBaudRate((BaudRateType)ui->BaudRatecomboBox->currentText().toInt());

    //设置数据位
    myCom->setDataBits((DataBitsType)ui->DataBitscomboBox->currentText().toInt());

    //设置校验位
    switch(ui->ParitycomboBox->currentIndex())
    {
        case 0:
            myCom->setParity(PAR_NONE);
        break;
        case 1:
            myCom->setParity(PAR_ODD);
        break;
        case 2:
            myCom->setParity(PAR_EVEN);
        break;
        default:
            myCom->setParity(PAR_NONE);
            qDebug("set to default : PAR_NONE");
        break;
    }

    //设置停止位
    switch(ui->StopBitscomboBox->currentIndex())
    {
        case 0:
            myCom->setStopBits(STOP_1);
        break;
        case 1:
            myCom->setStopBits(STOP_1_5);
        break;
        case 2:
            myCom->setStopBits(STOP_2);
        break;
        default:
            myCom->setStopBits(STOP_1);
            qDebug("set to default : STOP_1");
        break;
    }

    //设置数据流控制
    myCom->setFlowControl(FLOW_OFF);

    //设置延时
    myCom->setTimeout(TIME_OUT);

    //以可读写方式打开串口
    bool flag = myCom->open(QIODevice::ReadWrite);

Linux(ubuntu)平台:

稍有不同,需将win_qextserialport.cpp和win_qextserialport.h 换为 posix_qextserialport.cpp和posix_qextserialport.h。

用法类似。比如:

头文件声明:

Posix_QextSerialPort *myComA;

打开和配置串口:

#ifdef ARM
    myComA = new Posix_QextSerialPort("/dev/ttymxc4", QextSerialBase::Polling);
#endif
#ifndef ARM
    myComA = new Posix_QextSerialPort("/dev/ttyUSB1", QextSerialBase::Polling);
#endif
    if(!myComA->open(QIODevice::ReadWrite))
    {
        qDebug()<<"Warning : serialPortA open failed.";
    }
    else
        qDebug()<<"Open serialPortA success!";

    myComA->setBaudRate(BAUD57600);
//    myComA->setBaudRate(BAUD115200);
    myComA->setDataBits(DATA_8);
    myComA->setParity(PAR_NONE);
    myComA->setStopBits(STOP_1);
    myComA->setFlowControl(FLOW_OFF);
    myComA->setTimeout(10);

这里的条件编译是方便我在ubuntu桌面平台和ARM嵌入式板端调试,请忽略。

探讨两个平台不同之处:

Qt 谈一谈串口serialport_第2张图片

1.两种轮询模式:

window平台下支持:QextSerialPort::Polling //异步读写   和   QextSerialPort::EventDriven //同步读写(接受到数据即读取)

linux平台下只支持: QextSerialPort::Polling //异步读写(需要开定时器读取)

2. 支持的波特率不同:

Qt 谈一谈串口serialport_第3张图片

更多详情请查看:https://qextserialport.github.io/1.2/qextserialport.html#details

qt5之后

Qt官方引入了QSerialPort类,然后使用serialport时就方便多了,一般包括以下几个步骤:

1. 项目文件.pro,加入serialport模块:

QT += serialport

2. 自定义类头文件,按自身需求加入官方库,如:

#include 
#include 

3. 使用时:

先头文件申明类对象:

QSerialPort *m_serialPort;

后打开和配置串口:

    m_serialPort = new QSerialPort("COM3");

    if(!m_serialPort->open(QIODevice::ReadWrite))//ReadWrite 模式
    {
	qDebug()<<"打开失败!";
	return;
    }
    else
	qDebug()<<"打开串口成功!";
    m_serialPort->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections);
    m_serialPort->setDataBits(QSerialPort::Data8);             //数据位为8
    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);  //无流控制
    m_serialPort->setParity(QSerialPort::NoParity);	       //无校验位
    m_serialPort->setStopBits(QSerialPort::OneStop);           //停止位1

以上仅是个人对qt中串口使用的大概了解,各位有补充的欢迎留言指导及斧正,谢谢大家,预祝大家中秋佳节快乐。

你可能感兴趣的:(qt,qt笔记,mynote)