linux下QT开发串口通信助手

来源:互联网 发布:韩国视频软件 编辑:程序博客网 时间:2024/03/28 19:09

串口通信的应用十分广泛,所以在QT下编写一个串口通信程序就显得尤为重要。下面将一步一步叙述开发过程:
1.下载第三方QT串口类,免积分
http://download.csdn.net/detail/cmh477660693/9726584
2、首先来看一下串口通信几个关键文件:
posix_qextserialport.cpp和posix_qextserialport.h文件定义了一个Posix_QextSerialPort类;
qextserialbase.cpp和qextserialbase.h文件定义了一个QextSerialBase类 ;
3、读取串口方式:Polling(查询方式)和EventDriven(事件驱动方式)
此两种方式在QextSerialBase类的一个枚举变量QueryMode中定义了。
事件驱动方式:使用事件处理串口的读取,一旦有数据到来,就会发出readyRead()信号,在事件驱动、的方式下,串口的读写是异步的,调用读写函数会立即返回,它们不会冻结调用线程。
查询方式:读写函数是同步执行的,信号不能工作在这种模式下,而且有些功能也无法实现。需要建立定时器来读取串口的数据。
注意:在Windows下支持以上两种模式,而在Linux下只支持Polling模式。
4、总结一下:
我们在Qt中使用这个类编写串口程序,根据平台的不同只需要分别使用四个文件。在Linux下是:
qextserialbase.cpp和qextserialbase.h 以及posix_qextserialport.cpp和posix_qextserialport.h
在Linux下我们只能使用查询Polling方式。
5.工程命名为myCom,Base Class选择mainwindow。
然后将有关Linux下串口配置文件(cpp和h文件)添加到工程里面去:
这里写图片描述
ui界面如图
这里写图片描述
,并给Push_Button右键添加点击信号。
6.在miniwindow.h添加头文件和声明私有槽函数
#include”posix_qextserialport.h”
private slots:
void readMyCom();
void on_pushButton_clicked();

在minwindows.cpp添加

#include "mainwindow.h"#include "ui_mainwindow.h"#include "qextserialbase.h"#include<QTimer>MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    QTimer *readtimer = new QTimer(this);    readtimer->start(100);    ui->setupUi(this);    struct PortSettings myComSetting = {BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};    //定义一个结构体,用来存放串口各个参数     myCom = new Posix_QextSerialPort("/dev/ttyUSB0",myComSetting,QextSerialBase::Polling);     myCom ->open(QIODevice::ReadWrite);//以可读写方式打开串口     myCom->setTimeout(100);//设置时间间隔    connect(readtimer,SIGNAL(timeout()),this,SLOT(readMyCom()));//信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作    }MainWindow::~MainWindow(){    delete ui;}void MainWindow::readMyCom() //读串口函数{QByteArray temp = myCom->readAll();//读取串口缓冲区的所有数据给临时变量tempui->textBrowser->insertPlainText(temp);//将串口的数据显示在窗口的文本浏览器中}static char ConvertHexChar(char ch){    if((ch >= '0') && (ch <= '9'))        return ch-0x30;    else if((ch >= 'A') && (ch <= 'F'))        return ch-'A'+10;    else if((ch >= 'a') && (ch <= 'f'))        return ch-'a'+10;    else return (-1);}static QByteArray QString2Hex(QString str)    {        QByteArray senddata;        int hexdata,lowhexdata;        int hexdatalen = 0;        int len = str.length();        senddata.resize(len/2);        char lstr,hstr;        for(int i=0; i<len; )        {            hstr=str[i].toLatin1();            if(hstr == ' ')            {                i++;                continue;            }            i++;            if(i >= len)                break;            lstr = str[i].toLatin1();            hexdata = ConvertHexChar(hstr);            lowhexdata = ConvertHexChar(lstr);            if((hexdata == 16) || (lowhexdata == 16))                break;            else                hexdata = hexdata*16+lowhexdata;            i++;            senddata[hexdatalen] = (char)hexdata;            hexdatalen++;        }        senddata.resize(hexdatalen);        return senddata;    }void MainWindow::on_pushButton_clicked(){    //myCom->write(ui->lineEdit->text().toLatin1().data()); //以ASCII码形式将数据写入串口    QByteArray senddata = QString2Hex(ui->lineEdit->text());      //转换为16进制    myCom->write(senddata);}
1 0