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
生成了相互连接的虚拟串口 /dev/pts/18和/dev/pts/19
开启socat服务,同时打开两个终端作为服务器与客户端尝试进行通信
通信成功,接下来通过代码实现通信
//定义客户端与服务器端口属性
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());
}
运行结果如下:
二、Windows
下载虚拟串口工具CVSPD,添加互联的串口COM1、COM2
代码通信:
//遍历本机可用串口
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());
}
结果如下:
可以在CVSPD中看到串口实时通信数据
有问题请指教,不喜勿喷。