linux下QT开发串口通信助手

串口通信的应用十分广泛,所以在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文件)添加到工程里面去:
linux下QT开发串口通信助手_第1张图片
ui界面如图
linux下QT开发串口通信助手_第2张图片
,并给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

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();

//读取串口缓冲区的所有数据给临时变量temp
ui->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; istr[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);
}

你可能感兴趣的:(QT开发初探)