【QT】串口收发

1、添加第三方qextserialport库

下载路径

https://download.csdn.net/download/qq_37016048/12442027

解压复制粘贴到工程路径,在工程文件pro文件中添加工程

include($$PWD/qextserialport/qextserialport.pri)

编译后pri库被加载到工程中。

2、串口初始化

定义如下变量、并将其初始化,因为使用需要,我将除了串口号之外的其他配置固化。

    bool comOK;             //串口是否打开
    QString      PortName;   //串口号
    BaudRateType BaudRate;   //波特率
    DataBitsType DataBit;    //数据位
    ParityType   Parity;     //校验位
    StopBitsType StopBit;    //停止位

    BaudRate = BAUD115200;
    DataBit  = DATA_8;
    Parity   = PAR_NONE;
    StopBit  = STOP_1;

搜索可用的串口号 ---- 我使用的时比较笨的方法一个一个去找,哪位网友知道怎么直接搜索加载可用串口号的方式,还望布不吝赐教

//搜索可用串口
QStringList Usart::FindPort()
{
    QString protname;
    QStringList comlist;
    int i;
    bool valid_port,Contain_port;
    comlist.clear();
    //ubuntu下串口号文件形式
    for(i=0;i<=5;i++)
    {
        protname = QString("ttyUSB%1").arg(i);
        com = new QextSerialPort(protname,QextSerialPort::Polling);//Polling--异步读写  EventDriven--同步读写
        valid_port = com->open(QIODevice::ReadWrite);
        Contain_port = comlist.contains(protname);
        if(valid_port && !Contain_port)
            comlist << protname;
        com->close();
        delete com;
    }


    //windows下串口显示形式
    for(i=0;i<=20;i++)
    {
        protname = QString("COM%1").arg(i);
        com = new QextSerialPort(protname,QextSerialPort::Polling);//Polling--异步读写  EventDriven--同步读写
        valid_port = com->open(QIODevice::ReadWrite);
        Contain_port = comlist.contains(protname);
        if(valid_port && !Contain_port)
            comlist << protname;
        com->close();
        delete com;
    }
    //将其添加到下拉列表中呈现
    ui->cboxPortName->clear();
    ui->cboxPortName->addItems(comlist);
    return comlist;
}

打开关闭串口

//打开串口
bool Usart::OpenUsart()
{
    //打开端口
    com = new QextSerialPort(PortName,QextSerialPort::Polling);
    comOK = com->open(QIODevice::ReadWrite);
    //清空缓冲区
    com->flush();
    //设置波特率
    com->setBaudRate(BaudRate);
    //设置数据位
    com->setDataBits(DataBit);
    //设置校验位
    com->setParity(Parity);
    //设置停止位
    com->setStopBits(StopBit);
    com->setFlowControl(FLOW_OFF);
    com->setTimeout(10);
    if(!comOK)
        qDebug()<btnFindPort->setEnabled(false);
    }
    return comOK;
}
//关闭串口
void Usart::CloseUsart()
{
    //关闭端口
    com->close();
    //改变显示状态
    comOK = false;
    //
    ui->btnFindPort->setEnabled(true);
}

串口收发

//串口发送
int Usart::UsartSendData()
{
    if(!comOK)
    {
        qDebug("usart is not open!");
        return Error_Port;
    }
    else if(UsartSendLenth<=0)
    {
        qDebug()<<"数据发送错误";
        return Error_Data;
    }
    //串口标记占用
    UsartUseing  = true;
    QByteArray buffer;
    buffer.resize(UsartSendLenth);
    memcpy(buffer.data(),UsartSendBuff,(size_t)(UsartSendLenth));
    
    //串口发送
    com->write(buffer);

    //清空串口默认控件
    memset(UsartSendBuff,0,UsartSendLenth);
    UsartSendLenth = 0;
    //取消串口占用
    UsartUseing  = false;
    qDebug()<<"-----串口发送完成-----";
    return Success;
}
//串口接收
int Usart::UsartReadData()
{
    UsartUseing = true;
    QByteArray buffer = com->readAll();
    if(buffer.isEmpty())
    {
        UsartRecvLenth = 0;
        UsartUseing  = false;
        return Recv_Empty;
    }
    UsartRecvLenth = (uint16_t)buffer.length();
    if(UsartRecvLenth<=0)
    {
        UsartRecvLenth = 0;
        UsartUseing  = false;
        qDebug()<

如上一些处理为本人在做项目时的需求,有些地方是不必要的,且收发方式是一发一收的固定模式,若要想串口助手一样同步收发,可以配合定时器接收

你可能感兴趣的:(QT)