Windows平台,QT Creator实现串口通讯程序,实现十六进制数据的接收,使用的是第三方的qextserialport类。完全实现!!!

在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类。我们可以去

官网上下载。http://sourceforge.net/projects/qextserialport/files/,也可以直接去

下载到的文件为 qextserialport-1.2win-alpha.zip解压后如下图:

Windows平台,QT Creator实现串口通讯程序,实现十六进制数据的接收,使用的是第三方的qextserialport类。完全实现!!!

我们在windows下只需要使用其中的6个文件:

qextserialbase.cpp和qextserialbase.h,

qextserialport.cpp和qextserialport.h,

win_qextserialport.cpp和win_qextserialport.h

第一部分

下面我们将讲述编程的详细过程,这里我们先给出完整的程序,然后到第二部分再进行逐句分析。

1.打开Qt Creator,新建Qt Gui Application,工程名随便你自己设置,也可以设置的和我的一样,其他使用默认选项。

(注意:建立的工程路径不能有中文。)

2.将上面所说的6个文件复制到工程文件夹下,如下图。
Windows平台,QT Creator实现串口通讯程序,实现十六进制数据的接收,使用的是第三方的qextserialport类。完全实现!!!

3.在工程中添加这6个文件。

新建工程然后在Qt Creator中左侧的文件列表上,鼠标右击工程文件夹,在弹出的菜单中选择Add Existing Files,添加刚才复制到工程的6个文件已存在的文件。如下图:

Windows平台,QT Creator实现串口通讯程序,实现十六进制数据的接收,使用的是第三方的qextserialport类。完全实现!!!

在serial2.h的相应位置添加头文件#include "win_qextserialport.h",添加对象声明Win_QextSerialPort *myCom;添加槽函数声明 void readMyCom()

点击文件serial2.ui,在窗口上加入一个Text Browser,用来显示信息

加入“打开串口”,“关闭串口”“传送数据”三个按钮,加入了一个行编辑框Line Edit。它们的命名如下:

“打开串口”按钮命名为:openMyComBtn

“关闭串口”按钮命名为:closeMyComBtn

“传送数据”按钮命名为:sendMsgBtn

要传送数据的行编辑框命名为:sendMsgLineEdit

界面如下图。

Windows平台,QT Creator实现串口通讯程序,实现十六进制数据的接收,使用的是第三方的qextserialport类。完全实现!!!

在serial2.cpp中添加构造函数

void serial2::on_openMyComBtn_clicked()
{
    struct PortSettings myComSetting = {BAUD115200,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};

    //定义一个结构体,用来存放串口各个参数

    myCom = new Win_QextSerialPort("com4",myComSetting,QextSerialBase::EventDriven);

    //定义串口对象,并传递参数,在构造函数里对其进行初始化

    myCom ->open(QIODevice::ReadWrite);

    //以可读写方式打开串口

    connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));

    //信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作

    ui->openMyComBtn->setEnabled(false); //打开串口后“打开串口”按钮不可用

    ui->closeMyComBtn->setEnabled(true); //打开串口后“关闭串口”按钮可用

    ui->sendMsgBtn->setEnabled(true); //打开串口后“发送数据”按钮可用

}

void serial2::on_closeMyComBtn_clicked()
{

    myCom->close(); //关闭串口,该函数在win_qextserialport.cpp文件中定义

    ui->openMyComBtn->setEnabled(true); //关闭串口后“打开串口”按钮可用

    ui->closeMyComBtn->setEnabled(false); //关闭串口后“关闭串口”按钮不可用

    ui->sendMsgBtn->setEnabled(false); //关闭串口后“发送数据”按钮不可用


}


void serial2::on_sendMsgBtn_clicked()
{

    QString str = ui->sendMsgLineEdit->text().toLatin1();
    QByteArray senddata;
    StringToHex(str,senddata);
    myCom->write(senddata);
    //myCom->write(ui->sendMsgLineEdit->text().toLatin1());

    //以十六进制码形式将行编辑框中的数据写入串口
}
void serial2::readMyCom() //读串口函数

{

    QByteArray temp = myCom->readAll();    //读取串口缓冲区的所有数据给临时变量temp
    QDataStream out(&temp,QIODevice::ReadWrite);
    while(!out.atEnd())
    {
        qint8 outChar = 0;
        out>>outChar;   //每字节填充一次,直到结束
        //十六进制的转换
        QString str = QString("%1").arg(outChar & 0xFF,2,16,QLatin1Char('0'));
        ui->textBrowser->insertPlainText(str.toUpper());//大写
        ui->textBrowser->insertPlainText(" ");//每发送两个字符后添加一个空格
        ui->textBrowser->moveCursor(QTextCursor::End);
     }
}

 然后要添加十六进制转换函数

char serial2::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);
        else return ch-ch;//不在0-f范围内的会发送成0
}

void serial2::StringToHex(QString str, QByteArray & senddata) //字符串转换成16进制数据0-F
{
    int hexdata,lowhexdata;
    int hexdatalen = 0;
    int len = str.length();
    senddata.resize(len/2);
    char lstr,hstr;
    for(int i=0; i<len; )
    {
        //char lstr,
        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);
}

 

 运行显示如下图:

Windows平台,QT Creator实现串口通讯程序,实现十六进制数据的接收,使用的是第三方的qextserialport类。完全实现!!!

Windows平台,QT Creator实现串口通讯程序,实现十六进制数据的接收,使用的是第三方的qextserialport类。完全实现!!!

大家搭建不成功的可以给我发邮件[email protected],亲自帮你解决问题!