第三方提供的类,下载到的文件为qextserialport-1.2win-alpha,qextserialbase.cpp 和 qextserialbase.h 文件定义了一个 QextSerialBase 类,win_qextserialport.cpp 和 win_qextserialport.h 文件定义了一个 Win_QextSerialPort 类,posix_qextserialport.cpp 和 posix_qextserialport.h 文件定义了一个 Posix_QextSerialPort 类,qextserialport.cpp 和 qextserialport.h 文件定义了一个 QextSerialPort 类。
在其中提供了串口的两个驱动方式,一个是EventDriven事件驱动方式,另一个是Polling查询方式。EventDriven事件驱动方式,一旦有数据到来,就会发出readyRead()信号,我们可以关联该信号来读取串口的数据。在事件驱动的方式下,串口的读写是异步的,调用读写函数会立即返回,它们不会冻结调用线程。
Polling查询方式,读写方式是同步执行,信号不能在这种模式下工作,而某些功能就无法实现。但是这种模式下的开销较小,我们需要建立自己的定时器来读取串口数据。
有一条非常重要:在Window下两种模式都能支持,但是在linux下只能是Polling方式。
一、在windows下使用事件驱动方式:
在工程中添加qextserialbase.cpp 和 qextserialbase.h,win_qextserialport.cpp 和 win_qextserialport.h,qextserialport.cpp 和 qextserialport.h这六个文件
在头文件中把win_qextserialport.h包含进去
#include"win_qextserialport.h"
在头文件中声明私有对象和私有槽函数:
Win_QextSerialPort*myCom;//声明指针对象
void readMyCom();//声明读串口槽函数
在函数中设置串口参数:
Struct PortSettings myComSetting = { BAUD115200 ,DATA_8 ,PAR_NONE ,STOP_1 ,FLOW_OFF ,200 };//定义一个PortSettings类型的结构体,用来存放串口各个参数,PortSettings在qextserialbase.h中定义
myCom = new Win_QextSerialPort("COM4",myComSetting,QextSerialBase::EventDriven);//定义串口对象,并传递参数,在构造函数里对其进行初始化,使用事件驱动方式
myCom ->open(QIODevice::ReadWrite);//以可读写方式打开串口
connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));//信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作
构造读串口的槽函数:
voidMainWindow::readMyCom()//读串口函数
{
QByteArraytemp=myCom->readAll();
ui->textBrowser->insertPlainText(temp);//在浏览窗口中显示数据
}
二、在linux上使用polling查询方式:
在工程中加入qextserialbase.cpp 和 qextserialbase.h,posix_qextserialport.cpp 和 posix_qextserialport.h这四个文件
程序的串口设置跟Windows差不多,
头文件中:
将以前的#include "win_qextserialport.h"更改为#include"posix_qextserialport.h"
将以前的 Win_QextSerialPort *myCom;更改为Posix_QextSerialPort *myCom;
在函数中:
在函数中设置串口参数:
Struct PortSettingsmyComSetting = { BAUD115200,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,200 };//定义一个PortSettings类型的结构体,用来存放串口各个参数,PortSettings在qextserialbase.h中定义
myCom=newPosix_QextSerialPort("/dev/ttyUSB0",myComSetting,QextSerialBase::Polling);//注意Linux下的串口文件是在根目录里面的dev中,定义串口对象,并传递参数,在构造函数里对其进行初始化,使用查询方式
myCom->open(QIODevice::ReadWrite);//以可读写方式打开串口
在posix_qextserialport.cpp中修改setTimeout参数:
将原来的 setTimeout(Settings.Timeout_Sec,Setting.Timeout_Millisec);
改成setTimeout(Settings.Timeout_Millisec);
QByteArraytemp=myCom->readAll();//读缓冲区的数据
ui->textBrowser->insertPlainText(temp);//在浏览窗口中显示数据