QT在Windows和Linux下的虚拟串口通信

QT在Windows和Linux下的虚拟串口通信

Qt串口类包含在 serialport 中,需要在.pro中引用该文件,添加头文件

QT       += core gui serialport

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

一、Linux:

添加虚拟串口工具:socat
apt-get install socat
生成虚拟串口
socat -d -d PTY PTY
QT在Windows和Linux下的虚拟串口通信_第1张图片
生成了相互连接的虚拟串口 /dev/pts/18和/dev/pts/19

开启socat服务,同时打开两个终端作为服务器与客户端尝试进行通信
QT在Windows和Linux下的虚拟串口通信_第2张图片
通信成功,接下来通过代码实现通信

//定义客户端与服务器端口属性
    sersend=new QSerialPort();
    sersend->setPortName("/dev/pts/19");
    sersend->setBaudRate(QSerialPort::Baud9600);
    sersend->setDataBits(QSerialPort::Data8);
    sersend->setStopBits(QSerialPort::OneStop);
    sersend->setParity(QSerialPort::EvenParity);

    serread=new QSerialPort();
    serread->setPortName("/dev/pts/18");
    serread->setBaudRate(QSerialPort::Baud9600);
    serread->setDataBits(QSerialPort::Data8);
    serread->setStopBits(QSerialPort::OneStop);
    serread->setParity(QSerialPort::EvenParity);
//打开端口
    if(sersend->open(QIODevice::ReadWrite)&&serread->open(QIODevice::ReadWrite))
          qDebug()<<1;
//监听
    connect(serread,&QSerialPort::readyRead,[=]
                                                {
                                                    qDebug()<<serread->bytesAvailable();
                                                    ui->textEdit_2->setText(serread->readAll());

                                                    openlog("test",LOG_CONS|LOG_PID,LOG_USER);
                                                    syslog(LOG_INFO,ui->textEdit_2->toPlainText().toUtf8());
                                                    closelog();
                                                    system("tail -n 1 /var/log/syslog");
                                                });
//确认消息发送                          
void MainWindow::on_pushButton_clicked()
{
        sersend->write(ui->textEdit->toPlainText().toUtf8());
}

运行结果如下:
QT在Windows和Linux下的虚拟串口通信_第3张图片

二、Windows

下载虚拟串口工具CVSPD,添加互联的串口COM1、COM2
QT在Windows和Linux下的虚拟串口通信_第4张图片
代码通信:

//遍历本机可用串口
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        QSerialPort se;
        se.setPort(info);
        if(se.open(QIODevice::ReadWrite))
        {
            ui->com->addItem(se.portName());
        }
    }
  //选择串口创建连接
    ser=new QSerialPort();
    ser->setPortName(ui->com->currentText());
    if(ser->open(QIODevice::ReadWrite))
    ser->setBaudRate(QSerialPort::Baud9600);
    ser->setDataBits(QSerialPort::Data8);
    ser->setStopBits(QSerialPort::OneStop);
    ser->setParity(QSerialPort::EvenParity);
    ser->setFlowControl(QSerialPort::NoFlowControl);

    ser1=new QSerialPort();
    ser1->setPortName(ui->com->itemText(1));
    if(ser1->open(QIODevice::ReadWrite))
    ser1->setBaudRate(QSerialPort::Baud9600);
    ser1->setDataBits(QSerialPort::Data8);
    ser1->setStopBits(QSerialPort::OneStop);
    ser1->setParity(QSerialPort::EvenParity);
    ser1->setFlowControl(QSerialPort::NoFlowControl);
}
//发送数据
void MainWindow::on_send_clicked()
{
    ser->write(ui->write->toPlainText().toUtf8(),ui->write->toPlainText().toUtf8().length());
    ui->read->setText(ser1->readAll());
}

结果如下:
QT在Windows和Linux下的虚拟串口通信_第5张图片
可以在CVSPD中看到串口实时通信数据
QT在Windows和Linux下的虚拟串口通信_第6张图片有问题请指教,不喜勿喷。

你可能感兴趣的:(c++)