Linux虚拟串口 及 Qt串口通信


2011-05-13 14:10  1337人阅读  评论(0)  收藏  举报


qt linux 终端 timer 工具 signal


Linux虚拟串口 及 Qt串口通信





Linux下的虚拟终端

由于手上没有可以测试的串口设备,因此发了点时间找了一个Linux下的虚拟串口工具

这个工具打开了两个伪终端,然后读两个口子的数据,如果是从1号口来的,就往2号口写入数据,从2号口来的就写到1号口。

经过我的修改后变成了这个样子:

#! /usr/bin/env python
#coding=utf-8
import pty
 import os
 import selectdef mkpty():
     #
     master1, slave = pty.openpty()
     slaveName1 = os.ttyname(slave)
     master2, slave = pty.openpty()
     slaveName2 = os.ttyname(slave)
     print '/nslave device names: ', slaveName1, slaveName2
     return master1, master2 if __name__ == "__main__":
    master1, master2 = mkpty()
     while True:        
         rl, wl, el = select.select([master1,master2], [], [], 1)
         for master in rl:
             data = os.read(master, 128)
             if master==master1:
                 print "read %d data:" % len(data)
                 print data
                 #os.write(master2, data)
             else:
                 print "to write %d data:" % len(data)
                 print data.strip()
                 os.write(master1, data.strip())


改变后 我们让1号口为读入口(串口设备读入数据的口子),2号口为写出口(串口向外面写数据)

将其保存为com.py

#python com.py

slave device names:  /dev/pts/1 /dev/pts/2
意思是pts/1为1号口 pts/2为2号口

另建一个终端 #cd /dev/pts/

#echo 456 > 2

就会向2号口写数据,如果我们没有其他程序读串口的数据的话,那么就会出现4行数:

to write 5 data:
456
read 3 data:
456
那么我们只要用程序读/dev/pts/1就可以模拟串口通信了

============================================================

Qt下的串口通讯

Qt没有自带串口模块,只有第三方库

http://wenku.baidu.com/view/55849f4ffe4733687e21aa99.html

这篇文章介绍了简单的Qt串口通信

学着他的例子也做了一个程序,核心代码:

MainWindow::MainWindow(QWidget *parent) :
     QMainWindow(parent),
     ui(new Ui::MainWindow)
 {
     ui->setupUi(this);
     com = new QextSerialPort("/dev/pts/1", QextSerialPort::Polling);
     com->open(QextSerialPort::ReadWrite);
     com->setBaudRate(BAUD9600);
     com->setDataBits(DATA_8);
     com->setParity(PAR_NONE);
     com->setStopBits(STOP_1);
     com->setFlowControl(FLOW_OFF);
     com->setTimeout(10);    QTimer *timer = new QTimer(this);
     connect(timer, SIGNAL(timeout()), this, SLOT(readCOM()));
     timer->start(20);}
void MainWindow::readCOM()
 {
     if (com->bytesAvailable() > 1)
         ui->showText->insertPlainText(com->readAll());
 }void MainWindow::on_btnSend_clicked()
 {
     com->write(ui->edit->text().toAscii().data());
 }

运行结果:

Qt向串口写数据

Linux虚拟串口 及 Qt串口通信_写数据

收到数据:

Linux虚拟串口 及 Qt串口通信_串口_02

 

串口向Qt写数据(下面那个终端控制)

Linux虚拟串口 及 Qt串口通信_串口_03

 


==========================================================

注意:1号口和2号口的方向问题很难分清楚,暂时这样理解了没必要深究

           windows下的虚拟串口工具为VSPM,是Telnet管理的,建议先研究这个