Qt開發串口通信以及座標顯示程序並移植

原創文章,歡迎轉載,轉載請註明:http://www.fishcode.cn/qt.html

CSDN: blog.csdn.net/jjzhoujun2010

作者:Dream Fly

  畢業了,整理下思緒,把我之前在實驗室弄的一個Qt終端界面開發的程序的整體思路以及源代碼共享開來,以便於更好地讓Qt爲人所知,爲開源貢獻點我的微薄之力。

一. 項目介紹

  項目背景的簡要介紹:通過串口從數據採集板傳輸數據到終端板上面,自行設計一個界面用來顯示收集到的數據,以及畫出所對應的座標點。終端顯示界面的板子是基於S3C6410芯片的,板子是師兄根據Mini6410開發板電路圖畫出來的,做了部分裁剪。

  由於考慮到跨平臺以及移植性問題,我選擇了Qt進行開發,分別開發了Windows以及Linux版本,並且移植到開發板上面。以下截圖1,圖2所示:

             

                                       圖1 Windows版本                                                                                                   圖2 Linux版本

  編寫控制Qt串口通信終端界面時候,串口通信部分是參考yafeilinux的串口通信教程:http://blog.csdn.net/yafeilinux/article/details/4717706  Windows, Linux需要相應改寫第三方類,yafeilinux裏面已經有介紹。由於我要用的poll查詢機制,利用settime(sec),因此更改了"*_qextserialport.cpp"文件裏面的對應函數,如下圖3所示:

圖3  修改*_qextserialport.cpp文件

  下圖3是Windows下的項目文件截圖:


圖3  Windows下項目源文件

二. Windows平臺編寫過程

  整個項目我是利用QT的designer和手寫代碼互相配合完成的。新建了一個帶有ui的項目以後,添加第三方串口類源文件。在ui裏面畫出相應的東西,我是用了tabWidget來切換幾個界面,在主界面中還用了tableView表格來顯示各個參數,如上圖1所示,對應的源程序代碼如下。

  頭文件mainwindow.h,定義聲明瞭各種類和變量。

//******************* mainwindow.h ************//
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QString>
#include <QStandardItemModel>
//#include "posix_qextserialport.h"
#include "win_qextserialport.h"
#include <QDebug>
#include <QTime>
#include <QTimer>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
//    void paintEvent(QPaintEvent *);

private:
    Ui::MainWindow *ui;
    Win_QextSerialPort *myCom;
//    Posix_QextSerialPort *myCom;
    QStandardItemModel *model;
    int row, column;            //table size
    QTimer *myReadTimer;            //採用polling查詢的方式進行
//    QTimer *tableDisTimer;

    int flag_startToConvert;
    float  QBArray2Float(QByteArray temp);
//    void paintEvent(QPaintEvent *);
    void draw();
    //QPushButton *iButton;
    //QLabel *iLabel;

protected:
    bool eventFilter(QObject *obj, QEvent *e);

private slots:
//    int delayUpdate();
//    void delayUpdate();
    void readMyCom();
    void on_openMyComBtn_clicked();
    void on_closeMyComBtn_clicked();
    void on_helpBtn_clicked();
    void on_inputBtn_clicked();
};
#endif // MAINWINDOW_H

  mainwindow.cpp文件,具體實現各個子函數的功能。

//****************************** mainwindow.cpp *****************//
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>
#include <QtGui>

float QBArray2Float(QByteArray temp);

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->radarWidget->installEventFilter(this);    // 使之能夠直接在radarWidget中繪圖
    ui->closeMyComBtn->setEnabled(false);
    setWindowTitle(tr("汽車防撞雷達界面顯示"));
    // 初始化第一個表格
    row = 13;
    column = 3;
    model = new QStandardItemModel(row, column);
    ui->tableView->setModel(model);
    ui->tableView->verticalHeader()->hide();        // Hide the vertical No.
    model->setHeaderData(0, Qt::Horizontal, tr("目標"));
    model->setHeaderData(1, Qt::Horizontal, tr("距離/ (米)"));
    model->setHeaderData(2, Qt::Horizontal, tr("方位/ (度)"));
}

MainWindow::~MainWindow(){
    delete ui;
}

// ASCII --> Float

float floatData[20][2] = {{0, 0}};   // 全局變量,讓coordinate.cpp文件也可以調用
int ti = 0, tj = 0;  // 爲了避免將i, j當成全局變量時候,其他函數可能會做相應的修改, 不能定義成static,
                     // 不然外部文件coordinate.cpp就無法使用ti了。
int dcFlag = 0;      // 標誌位,當其爲1的時候表示座標軸上也相應顯示出圖點
//static int disFlag = 0; // 當爲1時候表示經過延時後才顯示出來數據,用定時器控制disFlag的值

void MainWindow::readMyCom()
{
    int rflag = 0;
    int serialNum = 0;
    int num = 0;
    static int rNum = 2;    // 一個目標有2個參數需要顯示:距離、方位
//    myReadTimer->stop();          // turn off timer
    ui->radarWidget->update();  //刷新座標系,實時顯示圖形

//    if(1 == disFlag)      //延時顯示標誌
//    {
        model->removeRows(0, model->rowCount());
        model->setRowCount(row);
        model->setColumnCount(column);
        ui->tableView->update();
//    }

    QByteArray testFrame = myCom->read(5);      //幀頭"Star"有5個字符,因此read(5)
    if(testFrame.startsWith("Star"))
    {
        dcFlag = 1;
        qDebug()<<"Start to go"<<endl;
        rflag = 1;      // can receive frame

        for(int i = 0; i < 50; i++)
        {
            serialNum = myCom->bytesAvailable();
            if(serialNum >= num)
            {
                serialNum = 0;
                break;
            }
        }
        QByteArray dataFrame = myCom->read(4);  //從數據採集板上傳送過來的數據是4個字節1組
        num = QBArray2Float(dataFrame);
        for(ti = 0; ti < num; ti++)
        {
//            if(1 == disFlag)        // 延時0.5s標誌
//            {
                QStandardItem *itemTarget = new QStandardItem(QString::number(ti + 1));
                model->setItem(ti, 0, itemTarget);       //如何實現居中顯示???
//            }

            for(tj = 0; tj < rNum; tj++)
            {
                dataFrame = myCom->read(4);
                floatData[ti][tj] = QBArray2Float(dataFrame);
//                if(1 == disFlag)
//                {
                    QString str;
                    QStandardItem *itemFloat = new QStandardItem(str.sprintf("%0.2f", floatData[ti][tj]));
                    model->setItem(ti, tj + 1, itemFloat);
//                }
            }

        }
//        disFlag = 0;
    }
    else
    {
        qDebug()<<"receive"<<endl;
        rflag = 0;
        myCom->readAll();    // read off the data
        dcFlag = 0;          // 同時座標軸不顯示紅點
       // myReadTimer->start();
    }
    rflag = 0;
//    myReadTimer->start();   // turn on the timer
}



//void MainWindow::delayUpdate()
//{
//    disFlag = 1;
//    return disFlag;
//}


//將傳輸過來的字符串直接轉換浮點數函數
float MainWindow::QBArray2Float(QByteArray temp)
{
       unsigned int i;
       float f;
       temp.resize(4);
       i=0;
       i|=((unsigned char) temp.at(3));
       i=i<<8;
       i|=((unsigned char) temp.at(2));
       i=i<<8;
       i|=((unsigned char) temp.at(1));
       i=i<<8;
       i|=((unsigned char) temp.at(0));
       f = *(float*)&i;
       return f;
}

//打開串口的信號與槽自動關聯函數
void MainWindow::on_openMyComBtn_clicked()
{
//    QString portName = "/dev/" + ui->portNameComboBox->currentText(); //獲取串口名
    QString portName = ui->portNameComboBox->currentText(); //獲取串口名
//    myCom = new Posix_QextSerialPort(portName, QextSerialBase::Polling);
    myCom = new Win_QextSerialPort(portName, QextSerialBase::Polling);
    //定義串口對象,並傳遞參數,在構造函數裏對其進行初始化
    if(myCom->open(QIODevice::ReadWrite))
    {                     //注意:得要先打開串口,然後再設置串口的參數,不然設置無效!!!
        myCom->flush(); //存入緩衝區內待讀取

        //設置波特率
        if(ui->baudRateComboBox->currentText() == tr("9600"))   //根據組合框內容對串口進行設置
            myCom->setBaudRate(BAUD9600);
        else if(ui->baudRateComboBox->currentText() == tr("115200"))
            myCom->setBaudRate(BAUD115200);

        //設置數據位
        if(ui->dataBitsComboBox->currentText() == tr("8"))
            myCom->setDataBits(DATA_8);
        else if(ui->dataBitsComboBox->currentText() == tr("7"))
            myCom->setDataBits(DATA_7);

        //設置奇偶校驗
        if(ui->parityComboBox->currentText() == tr("無"))
            myCom->setParity(PAR_NONE);
        else if(ui->parityComboBox->currentText() == tr("奇校驗"))
            myCom->setParity(PAR_ODD);
        else if(ui->parityComboBox->currentText() == tr("偶校驗"))
            myCom->setParity(PAR_EVEN);

        //設置停止位
        if(ui->stopBitsComboBox->currentText() == tr("1"))
            myCom->setStopBits(STOP_1);
        else if(ui->stopBitsComboBox->currentText() == tr("2"))
            myCom->setStopBits(STOP_2);

        myCom->setFlowControl(FLOW_OFF); //設置數據流控制,我們使用無數據流的默認設置
        //myCom->setTimeout(500); //設置延時
        myCom->setTimeout(10); //設置延時      --Modify 改小點
        ui->StatusLabel->setText(tr("串口狀態:打開成功"));
    }
    else
    {
        ui->StatusLabel->setText(tr("串口狀態:打開失敗"));
        return;
    }


    //定義出具體定時器,然後觸發後開始Polling查詢
    myReadTimer = new QTimer(this);
    myReadTimer->setInterval(10);
    connect(myReadTimer, SIGNAL(timeout()), this, SLOT(readMyCom()));    //信號和槽函數關聯,當串口緩衝區有數據時,進行讀串口操作
    this->myReadTimer->start();         //開始poll查詢操作

    // 定義延時計數器
//    tableDisTimer = new QTimer(this);
//    tableDisTimer->setInterval(500);
//    connect(tableDisTimer, SIGNAL(timeout()), this, SLOT(delayUpdate()));
//    this->tableDisTimer->start();

    ui->openMyComBtn->setEnabled(false);
    ui->closeMyComBtn->setEnabled(true);
    ui->helpBtn->setEnabled(true);
    ui->portNameComboBox->setEnabled(false);
    ui->baudRateComboBox->setEnabled(false);
    ui->dataBitsComboBox->setEnabled(false);
    ui->stopBitsComboBox->setEnabled(false);
    ui->parityComboBox->setEnabled(false);
}

void MainWindow::on_closeMyComBtn_clicked()
{
    this->myReadTimer->stop();          //關閉poll操作
//    this->tableDisTimer->stop();
    myCom->close();
    model->removeRows(0, model->rowCount());
    model->setRowCount(row);
    model->setColumnCount(column);
    dcFlag = 0;
    ui->radarWidget->update();  //刷新座標系,實時顯示背景

    ui->openMyComBtn->setEnabled(true);
    ui->helpBtn->setEnabled(true);
    ui->portNameComboBox->setEnabled(true);
    ui->baudRateComboBox->setEnabled(true);
    ui->dataBitsComboBox->setEnabled(true);
    ui->stopBitsComboBox->setEnabled(true);
    ui->parityComboBox->setEnabled(true);
    ui->StatusLabel->setText(tr("串口狀態:關閉"));
}


void MainWindow::on_helpBtn_clicked()
{
    QMessageBox::about(this, tr("幫助信息"), tr("1.選定好具體串口設置,點擊打開串口即可收到信息" "\n"
                                              "2.防撞雷達項目小組共同努力製作" "\n"
                                              "3.Qt界面作者聯繫方式:周軍 QQ: 380774082" "\n"
                                              "4.歡迎訪問個人博客 http://blog.csdn.net/jjzhoujun2010"));
}

// 通過終端板子串口將數據下傳到數據採集板中
void MainWindow::on_inputBtn_clicked()
{
    QByteArray absoluteByte = ui->absoluteLineEdit->text().toAscii().data();
    QByteArray fastByte = ui->fastLineEdit->text().toAscii().data();
//    BYTE allByte_char[5] = {'0'};
    //QT中的回車只有一個字符\n,而windows下需要解釋爲\r\n;   根據FPGA接收端程序設計,需要中間加個0
    QByteArray allByte = absoluteByte + '0' + fastByte + '\r' + '\n';
    myCom->write(allByte);

    qDebug()<<absoluteByte<<fastByte<<allByte;
}

  coordinate.cpp文件中,由於我是在tabWidget裏面繪圖的,不能直接調用QPainter類,相應的解決方法有兩種:方法(1): 在子窗口ui.---派生一個類,在PaintEvent裏畫圖。 我所遇到的問題:不清楚自己構造的派生類如何跟ui.---相關聯起來,歸根到底就是自己C++使用得不熟悉。方法(2):事件過濾法。給ui.---安裝事件監視器,在QEvent::paint事件時QPainter paint(ui->---)畫圖。我使用的是第二種方法。

  座標圖顯示如下圖4所示,由於在QT裏面慢慢畫直線、弧線等各種座標點很麻煩,工作量大,因此我就確定好尺寸後,用PS自己弄了背景圖片,計算好相應的座標點,直接在上面顯示目標點。


圖4  座標圖顯示


//*************************** coordinate.cpp *********************
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <stdlib.h>
#include <QtCore/qmath.h>


// radarWidget中畫圖
bool MainWindow::eventFilter(QObject *obj, QEvent *e)
{
    if(obj == ui->radarWidget)
    {
        if(e->type() == QEvent::Paint)
        {
            draw();
            qDebug()<<"Workinggggggggggggggggggggggggggg................................";
            return true;
        }
        else
        {
            qDebug()<<"Waiting";
        }
    }
    return QMainWindow::eventFilter(obj, e);
}

void MainWindow::draw()
{
    extern float floatData[20][2];      // 聲明下在mainwindow.cpp裏面定義的全局變量
    extern int dcFlag;                   // dcFlag = 1 時候相當不斷刷新, 等於0時候相當於關閉,進行清屏操作,留背景
    extern int ti;
    QPainter painter(ui->radarWidget);
    QPixmap pix;
    pix.load(":/coordinate05-18.png");
    painter.drawPixmap(0, 0, 400, 440, pix);

    painter.setBrush(Qt::red);              //先設定好畫筆顏色
    painter.translate(194, 432);        // 變換座標原點

    float radian = 0.140;               //設定弧度,讓其按照指定的角度偏移


//    dcFlag = 1;


    qDebug()<<dcFlag<<endl;
    if(dcFlag == 1)
    {
        int x = 0;
        // 2012-05-18,考慮角度偏移的座標確定,改小號圖像
        for(int j = 0; j < ti; j++)         // ti爲全局變量  不能實時傳送,只能當ti等於最後的數的時候才傳過來??
        {
            x = int(floatData[j][0] / 10);
            switch(x)
            {
            case 0:
                if(floatData[j][1] == 0)
                {
                    painter.drawEllipse(0, -(floatData[j][0] * 4.5), 10, 10);               // 0m - 10m內,0度偏角
                }

                else if(floatData[j][1] == 4)
                {
                    painter.drawEllipse((floatData[j][0] * 4.5) * qSin(radian),
                                        -((floatData[j][0] * 4.5) * qCos(radian)), 10, 10);    // 4度偏角
                }

                qDebug()<<(floatData[j][0] * 4.5)<<(floatData[j][0] * 4.5) * qSin(radian)
                       <<((floatData[j][0] * 4.5) * qCos(radian));
                break;
            case 1:
                if(floatData[j][1] == 0)
                    painter.drawEllipse(0, -(45 + (floatData[j][0] - 10) * 4.4), 10, 10);   // 10m - 20m內
                else if(floatData[j][1] == 4)
                    painter.drawEllipse((45 + (floatData[j][0] - 10) * 4.4) * qSin(radian),
                                        -((45 + (floatData[j][0] - 10) * 4.4) * qCos(radian)), 10, 10);   // 10m - 20m內
                break;
            case 2:
                if(floatData[j][1] == 0)
                    painter.drawEllipse(0, -(89 + (floatData[j][0] - 20) * 4.2), 10, 10);  // 20m - 30m內
                else if(floatData[j][1] == 4)
                    painter.drawEllipse((89 + (floatData[j][0] - 20) * 4.2) * qSin(radian),
                                        -(89 + (floatData[j][0] - 20) * 4.2) * qCos(radian), 10, 10);
                break;
            case 3:
                if(floatData[j][1] == 0)
                    painter.drawEllipse(0, -(131 + (floatData[j][0] - 30) * 4.2), 10, 10);  // 30m - 40m內
                else if(floatData[j][1] == 4)
                    painter.drawEllipse((131 + (floatData[j][0] - 30) * 4.2) * qSin(radian),
                                        -(131 + (floatData[j][0] - 30) * 4.2) * qCos(radian), 10, 10);  // 4度偏角
                break;
            case 4:
                if(floatData[j][1] == 0)
                    painter.drawEllipse(0, -(174 + (floatData[j][0] - 40) * 4.3), 10, 10);  // 40m - 50m內
                else if(floatData[j][1] == 4)
                    painter.drawEllipse((174 + (floatData[j][0] - 40) * 4.3) * qSin(radian),
                                        -(174 + (floatData[j][0] - 40) * 4.3) * qCos(radian), 10, 10);  // 4度偏角
                break;
            case 5:
                if(floatData[j][1] == 0)
                    painter.drawEllipse(0, -(218 + (floatData[j][0] - 50) * 4.4), 10, 10);  // 50m - 60m內
                else if(floatData[j][1] == 4)
                    painter.drawEllipse((218 + (floatData[j][0] - 50) * 4.4) * qSin(radian),
                                        -(218 + (floatData[j][0] - 50) * 4.4) * qCos(radian), 10, 10);
                break;
            case 6:
                if(floatData[j][1] == 0)
                    painter.drawEllipse(0, -(261 + (floatData[j][0] - 60) * 4.3), 10, 10);  // 60m - 70m內
                else if(floatData[j][1] == 4)
                    painter.drawEllipse((261 + (floatData[j][0] - 60) * 4.3) * qSin(radian),
                                        -(261 + (floatData[j][0] - 60) * 4.3) * qCos(radian), 10, 10);
                break;
            case 7:
                if(floatData[j][1] == 0)
                    painter.drawEllipse(0, -(305 + (floatData[j][0] - 70) * 4.4), 10, 10);  // 70m - 80m內
                else if(floatData[j][1] == 4)
                    painter.drawEllipse((305 + (floatData[j][0] - 70) * 4.4) * qSin(radian),
                                        -(305 + (floatData[j][0] - 70) * 4.4) * qCos(radian), 10, 10);
                break;
            case 8:
                if(floatData[j][1] == 0)
                    painter.drawEllipse(0, -(343 + (floatData[j][0] - 80) * 3.8), 10, 10);  // 80m - 90m內
                else if(floatData[j][1] == 4)
                    painter.drawEllipse((343 + (floatData[j][0] - 80) * 3.8) * qSin(radian),
                                        -(343 + (floatData[j][0] - 80) * 3.8) * qCos(radian), 10, 10);
                break;
            case 9:
                if(floatData[j][1] == 0)
                    painter.drawEllipse(0, -(378 + (floatData[j][0] - 90) * 3.5), 10, 10);  // 90m - 100m內
                else if(floatData[j][1] == 4)
                    painter.drawEllipse((378 + (floatData[j][0] - 90) * 3.5) * qSin(radian),
                                        -(378 + (floatData[j][0] - 90) * 3.5) * qCos(radian), 10, 10);
                break;
            case 10:
                if(floatData[j][1] == 0)
                    painter.drawEllipse(0, -(410 + (floatData[j][0] - 100) * 3.2), 10, 10);  // 90m - 100m內
                else if(floatData[j][1] == 4)
                    painter.drawEllipse((410 + (floatData[j][0] - 100) * 3.2) * qSin(radian),
                                        -(410 + (floatData[j][0] - 100) * 3.2) * qCos(radian), 10, 10);
                break;
            default:
                break;
            }
            qDebug()<<x<<floatData[j][0]<<floatData[j][1]<<j<<endl;
        }


        qDebug()<<ti<<endl;

        // testing local coordinate

//        painter.drawEllipse(0, 0, 10, 10);          // 0m
//        painter.drawEllipse(0, -(45), 10, 10);      // 10m
//        painter.drawEllipse(0, -(89), 10, 10);     // 20m
//        painter.drawEllipse(0, -(131), 10, 10);     // 30m
//        painter.drawEllipse(0, -(174), 10, 10);     // 40m
//        painter.drawEllipse(0, -(218), 10, 10);     // 50m
//        painter.drawEllipse(0, -(261), 10, 10);     // 60m
//        painter.drawEllipse(0, -(305), 10, 10);     // 70m
//        painter.drawEllipse(0, -(343), 10, 10);     // 80m
//        painter.drawEllipse(0, -(378), 10, 10);     // 90m
//        painter.drawEllipse(0, -(410), 10, 10);     // 100m
//
//        painter.drawEllipse(45 * qSin(radian), -(45 * qCos(radian)), 10, 10);    // 4度偏角
//        painter.drawEllipse(89 * qSin(radian), -(89 * qCos(radian)), 10, 10);    // 4度偏角
//        painter.drawEllipse(131 * qSin(radian), -(131 * qCos(radian)), 10, 10);    // 4度偏角
//        painter.drawEllipse(174 * qSin(radian), -(174 * qCos(radian)), 10, 10);    // 4度偏角
//        painter.drawEllipse(218 * qSin(radian), -(218 * qCos(radian)), 10, 10);    // 4度偏角
//        painter.drawEllipse(261 * qSin(radian), -(261 * qCos(radian)), 10, 10);    // 4度偏角
//        painter.drawEllipse(305 * qSin(radian), -(305 * qCos(radian)), 10, 10);    // 4度偏角
//        painter.drawEllipse(343 * qSin(radian), -(343 * qCos(radian)), 10, 10);    // 4度偏角
//        painter.drawEllipse(378 * qSin(radian), -(378 * qCos(radian)), 10, 10);    // 4度偏角
//        painter.drawEllipse(410 * qSin(radian), -(410 * qCos(radian)), 10, 10);    // 4度偏角
    }
}


  main.cpp文件

//************************ main.cpp *****************//
// 2012-05-18 版本,去掉延時顯示,進行實時顯示,未完成的部分:1.座標軸的座標對應的地方,以及刷新的問題;2.調試界面的實現。

#include <QtGui/QApplication>
#include <QTextCodec>       //加入頭文件
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());    //使程序可處理中文
    QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));   // For Window 7
//    QTextCodec::setCodecForTr(QTextCodec::codecForName("System")); // For all

//    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
//    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
    MainWindow w;
    w.show();

    return a.exec();
}

三、Linux版本

  我是在Fedora9 裏面進行Linux版本的編寫的,只需把相應的第三方類修改,相對應的定義也改掉,串口名稱那裏也要改,並添加前綴“/dev”,其他部分相同。

四、移植到Mini6410上面運行

  移植前需要修改下項目文件裏ui的串口名稱,改成ttySAC0, ttySAC1....之類的,然後在安裝了交叉編譯鏈,Qt4.7交叉編譯環境後,在Qt裏面選擇對應的編譯鏈進行編譯,具體做法參見《Mini6410 Qt4和Qtopia編程開發指南》。

五、總結

  從接手項目任務到完成大概花了3個月時間,期間由於其他事情斷斷續續地編程,Qt知識是從零開始學習的,以及由於個人C++水平有限,編寫的程序可能會不合理的地方,忘高手指導。通過完成此次的項目,我對於C++的學習又深入一步,以及學會了Qt這種跨平臺的SDK。我會分別把Windows版本,Linux版本的源文件上傳上來,供大家參考,互相學習。(備註:Linux版本的由於當初是直接在實驗室弄好,跟今天修改的Windows版本略有不同,因爲當初是爲了考慮嵌入式開發板的屏幕小,把選擇串口參數部分去掉,直接在程序裏面默認設定好了,需要修改的同學直接在裏面修改即可。)

Mini6410 Qt4和Qtopia編程開發指南》:http://download.csdn.net/detail/jjzhoujun2010/4393908




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章