Qt开发串口通信以及坐标显示程序并移植

 毕业了,整理下思绪,把我之前在实验室弄的一个Qt终端界面开发的程序的整体思路以及源代码共享开来,以便于更好地让Qt为人所知,为开源贡献点我的微薄之力。

一. 项目介绍

  项目背景的简要介绍:通过串口从数据采集板传输数据到终端板上面,自行设计一个界面用来显示收集到的数据,以及画出所对应的坐标点。终端显示界面的板子是基于S3C6410芯片的,板子是师兄根据Mini6410开发板电路图画出来的,做了部分裁剪。

  由于考虑到跨平台以及移植性问题,我选择了Qt进行开发,分别开发了Windows以及Linux版本,并且移植到开发板上面。以下截图1,图2所示:

   Qt开发串口通信以及坐标显示程序并移植_第1张图片        Qt开发串口通信以及坐标显示程序并移植_第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下的项目文件截图:

Qt开发串口通信以及坐标显示程序并移植_第3张图片

图3  Windows下项目源文件

二. Windows平台编写过程

  整个项目我是利用QT的designer和手写代码互相配合完成的。新建了一个带有ui的项目以后,添加第三方串口类源文件。在ui里面画出相应的东西,我是用了tabWidget来切换几个界面,在主界面中还用了tableView表格来显示各个参数,如上图1所示,对应的源程序代码如下。

  头文件mainwindow.h,定义声明了各种类和变量。

[cpp] view plain copy
  1. //******************* mainwindow.h ************//  
  2. #ifndef MAINWINDOW_H  
  3. #define MAINWINDOW_H  
  4.   
  5. #include <QMainWindow>  
  6. #include <QString>  
  7. #include <QStandardItemModel>  
  8. //#include "posix_qextserialport.h"  
  9. #include "win_qextserialport.h"  
  10. #include <QDebug>  
  11. #include <QTime>  
  12. #include <QTimer>  
  13.   
  14. namespace Ui {  
  15.     class MainWindow;  
  16. }  
  17.   
  18. class MainWindow : public QMainWindow  
  19. {  
  20.     Q_OBJECT  
  21.   
  22. public:  
  23.     explicit MainWindow(QWidget *parent = 0);  
  24.     ~MainWindow();  
  25. //    void paintEvent(QPaintEvent *);  
  26.   
  27. private:  
  28.     Ui::MainWindow *ui;  
  29.     Win_QextSerialPort *myCom;  
  30. //    Posix_QextSerialPort *myCom;  
  31.     QStandardItemModel *model;  
  32.     int row, column;            //table size  
  33.     QTimer *myReadTimer;            //采用polling查询的方式进行  
  34. //    QTimer *tableDisTimer;  
  35.   
  36.     int flag_startToConvert;  
  37.     float  QBArray2Float(QByteArray temp);  
  38. //    void paintEvent(QPaintEvent *);  
  39.     void draw();  
  40.     //QPushButton *iButton;  
  41.     //QLabel *iLabel;  
  42.   
  43. protected:  
  44.     bool eventFilter(QObject *obj, QEvent *e);  
  45.   
  46. private slots:  
  47. //    int delayUpdate();  
  48. //    void delayUpdate();  
  49.     void readMyCom();  
  50.     void on_openMyComBtn_clicked();  
  51.     void on_closeMyComBtn_clicked();  
  52.     void on_helpBtn_clicked();  
  53.     void on_inputBtn_clicked();  
  54. };  
  55. #endif // MAINWINDOW_H  

   mainwindow.cpp文件,具体实现各个子函数的功能。
[cpp] view plain copy
  1. //****************************** mainwindow.cpp *****************//  
  2. #include "mainwindow.h"  
  3. #include "ui_mainwindow.h"  
  4. #include <QMessageBox>  
  5. #include <QDebug>  
  6. #include <QtGui>  
  7.   
  8. float QBArray2Float(QByteArray temp);  
  9.   
  10. MainWindow::MainWindow(QWidget *parent) :  
  11.     QMainWindow(parent),  
  12.     ui(new Ui::MainWindow)  
  13. {  
  14.     ui->setupUi(this);  
  15.     ui->radarWidget->installEventFilter(this);    // 使之能够直接在radarWidget中绘图  
  16.     ui->closeMyComBtn->setEnabled(false);  
  17.     setWindowTitle(tr("汽车防撞雷达界面显示"));  
  18.     // 初始化第一个表格  
  19.     row = 13;  
  20.     column = 3;  
  21.     model = new QStandardItemModel(row, column);  
  22.     ui->tableView->setModel(model);  
  23.     ui->tableView->verticalHeader()->hide();        // Hide the vertical No.  
  24.     model->setHeaderData(0, Qt::Horizontal, tr("目标"));  
  25.     model->setHeaderData(1, Qt::Horizontal, tr("距离/ (米)"));  
  26.     model->setHeaderData(2, Qt::Horizontal, tr("方位/ (度)"));  
  27. }  
  28.   
  29. MainWindow::~MainWindow(){  
  30.     delete ui;  
  31. }  
  32.   
  33. // ASCII --> Float  
  34.   
  35. float floatData[20][2] = {{0, 0}};   // 全局变量,让coordinate.cpp文件也可以调用  
  36. int ti = 0, tj = 0;  // 为了避免将i, j当成全局变量时候,其他函数可能会做相应的修改, 不能定义成static,  
  37.                      // 不然外部文件coordinate.cpp就无法使用ti了。  
  38. int dcFlag = 0;      // 标志位,当其为1的时候表示坐标轴上也相应显示出图点  
  39. //static int disFlag = 0; // 当为1时候表示经过延时后才显示出来数据,用定时器控制disFlag的值  
  40.   
  41. void MainWindow::readMyCom()  
  42. {  
  43.     int rflag = 0;  
  44.     int serialNum = 0;  
  45.     int num = 0;  
  46.     static int rNum = 2;    // 一个目标有2个参数需要显示:距离、方位  
  47. //    myReadTimer->stop();          // turn off timer  
  48.     ui->radarWidget->update();  //刷新坐标系,实时显示图形  
  49.   
  50. //    if(1 == disFlag)      //延时显示标志  
  51. //    {  
  52.         model->removeRows(0, model->rowCount());  
  53.         model->setRowCount(row);  
  54.         model->setColumnCount(column);  
  55.         ui->tableView->update();  
  56. //    }  
  57.   
  58.     QByteArray testFrame = myCom->read(5);      //帧头"Star"有5个字符,因此read(5)  
  59.     if(testFrame.startsWith("Star"))  
  60.     {  
  61.         dcFlag = 1;  
  62.         qDebug()<<"Start to go"<<endl;  
  63.         rflag = 1;      // can receive frame  
  64.   
  65.         for(int i = 0; i < 50; i++)  
  66.         {  
  67.             serialNum = myCom->bytesAvailable();  
  68.             if(serialNum >= num)  
  69.             {  
  70.                 serialNum = 0;  
  71.                 break;  
  72.             }  
  73.         }  
  74.         QByteArray dataFrame = myCom->read(4);  //从数据采集板上传送过来的数据是4个字节1组  
  75.         num = QBArray2Float(dataFrame);  
  76.         for(ti = 0; ti < num; ti++)  
  77.         {  
  78. //            if(1 == disFlag)        // 延时0.5s标志  
  79. //            {  
  80.                 QStandardItem *itemTarget = new QStandardItem(QString::number(ti + 1));  
  81.                 model->setItem(ti, 0, itemTarget);       //如何实现居中显示???  
  82. //            }  
  83.   
  84.             for(tj = 0; tj < rNum; tj++)  
  85.             {  
  86.                 dataFrame = myCom->read(4);  
  87.                 floatData[ti][tj] = QBArray2Float(dataFrame);  
  88. //                if(1 == disFlag)  
  89. //                {  
  90.                     QString str;  
  91.                     QStandardItem *itemFloat = new QStandardItem(str.sprintf("%0.2f", floatData[ti][tj]));  
  92.                     model->setItem(ti, tj + 1, itemFloat);  
  93. //                }  
  94.             }  
  95.   
  96.         }  
  97. //        disFlag = 0;  
  98.     }  
  99.     else  
  100.     {  
  101.         qDebug()<<"receive"<<endl;  
  102.         rflag = 0;  
  103.         myCom->readAll();    // read off the data  
  104.         dcFlag = 0;          // 同时坐标轴不显示红点  
  105.        // myReadTimer->start();  
  106.     }  
  107.     rflag = 0;  
  108. //    myReadTimer->start();   // turn on the timer  
  109. }  
  110.   
  111.   
  112.   
  113. //void MainWindow::delayUpdate()  
  114. //{  
  115. //    disFlag = 1;  
  116. //    return disFlag;  
  117. //}  
  118.   
  119.   
  120. //将传输过来的字符串直接转换浮点数函数  
  121. float MainWindow::QBArray2Float(QByteArray temp)  
  122. {  
  123.        unsigned int i;  
  124.        float f;  
  125.        temp.resize(4);  
  126.        i=0;  
  127.        i|=((unsigned char) temp.at(3));  
  128.        i=i<<8;  
  129.        i|=((unsigned char) temp.at(2));  
  130.        i=i<<8;  
  131.        i|=((unsigned char) temp.at(1));  
  132.        i=i<<8;  
  133.        i|=((unsigned char) temp.at(0));  
  134.        f = *(float*)&i;  
  135.        return f;  
  136. }  
  137.   
  138. //打开串口的信号与槽自动关联函数  
  139. void MainWindow::on_openMyComBtn_clicked()  
  140. {  
  141. //    QString portName = "/dev/" + ui->portNameComboBox->currentText(); //获取串口名  
  142.     QString portName = ui->portNameComboBox->currentText(); //获取串口名  
  143. //    myCom = new Posix_QextSerialPort(portName, QextSerialBase::Polling);  
  144.     myCom = new Win_QextSerialPort(portName, QextSerialBase::Polling);  
  145.     //定义串口对象,并传递参数,在构造函数里对其进行初始化  
  146.     if(myCom->open(QIODevice::ReadWrite))  
  147.     {                     //注意:得要先打开串口,然后再设置串口的参数,不然设置无效!!!  
  148.         myCom->flush(); //存入缓冲区内待读取  
  149.   
  150.         //设置波特率  
  151.         if(ui->baudRateComboBox->currentText() == tr("9600"))   //根据组合框内容对串口进行设置  
  152.             myCom->setBaudRate(BAUD9600);  
  153.         else if(ui->baudRateComboBox->currentText() == tr("115200"))  
  154.             myCom->setBaudRate(BAUD115200);  
  155.   
  156.         //设置数据位  
  157.         if(ui->dataBitsComboBox->currentText() == tr("8"))  
  158.             myCom->setDataBits(DATA_8);  
  159.         else if(ui->dataBitsComboBox->currentText() == tr("7"))  
  160.             myCom->setDataBits(DATA_7);  
  161.   
  162.         //设置奇偶校验  
  163.         if(ui->parityComboBox->currentText() == tr("无"))  
  164.             myCom->setParity(PAR_NONE);  
  165.         else if(ui->parityComboBox->currentText() == tr("奇校验"))  
  166.             myCom->setParity(PAR_ODD);  
  167.         else if(ui->parityComboBox->currentText() == tr("偶校验"))  
  168.             myCom->setParity(PAR_EVEN);  
  169.   
  170.         //设置停止位  
  171.         if(ui->stopBitsComboBox->currentText() == tr("1"))  
  172.             myCom->setStopBits(STOP_1);  
  173.         else if(ui->stopBitsComboBox->currentText() == tr("2"))  
  174.             myCom->setStopBits(STOP_2);  
  175.   
  176.         myCom->setFlowControl(FLOW_OFF); //设置数据流控制,我们使用无数据流的默认设置  
  177.         //myCom->setTimeout(500); //设置延时  
  178.         myCom->setTimeout(10); //设置延时      --Modify 改小点  
  179.         ui->StatusLabel->setText(tr("串口状态:打开成功"));  
  180.     }  
  181.     else  
  182.     {  
  183.         ui->StatusLabel->setText(tr("串口状态:打开失败"));  
  184.         return;  
  185.     }  
  186.   
  187.   
  188.     //定义出具体定时器,然后触发后开始Polling查询  
  189.     myReadTimer = new QTimer(this);  
  190.     myReadTimer->setInterval(10);  
  191.     connect(myReadTimer, SIGNAL(timeout()), this, SLOT(readMyCom()));    //信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作  
  192.     this->myReadTimer->start();         //开始poll查询操作  
  193.   
  194.     // 定义延时计数器  
  195. //    tableDisTimer = new QTimer(this);  
  196. //    tableDisTimer->setInterval(500);  
  197. //    connect(tableDisTimer, SIGNAL(timeout()), this, SLOT(delayUpdate()));  
  198. //    this->tableDisTimer->start();  
  199.   
  200.     ui->openMyComBtn->setEnabled(false);  
  201.     ui->closeMyComBtn->setEnabled(true);  
  202.     ui->helpBtn->setEnabled(true);  
  203.     ui->portNameComboBox->setEnabled(false);  
  204.     ui->baudRateComboBox->setEnabled(false);  
  205.     ui->dataBitsComboBox->setEnabled(false);  
  206.     ui->stopBitsComboBox->setEnabled(false);  
  207.     ui->parityComboBox->setEnabled(false);  
  208. }  
  209.   
  210. void MainWindow::on_closeMyComBtn_clicked()  
  211. {  
  212.     this->myReadTimer->stop();          //关闭poll操作  
  213. //    this->tableDisTimer->stop();  
  214.     myCom->close();  
  215.     model->removeRows(0, model->rowCount());  
  216.     model->setRowCount(row);  
  217.     model->setColumnCount(column);  
  218.     dcFlag = 0;  
  219.     ui->radarWidget->update();  //刷新坐标系,实时显示背景  
  220.   
  221.     ui->openMyComBtn->setEnabled(true);  
  222.     ui->helpBtn->setEnabled(true);  
  223.     ui->portNameComboBox->setEnabled(true);  
  224.     ui->baudRateComboBox->setEnabled(true);  
  225.     ui->dataBitsComboBox->setEnabled(true);  
  226.     ui->stopBitsComboBox->setEnabled(true);  
  227.     ui->parityComboBox->setEnabled(true);  
  228.     ui->StatusLabel->setText(tr("串口状态:关闭"));  
  229. }  
  230.   
  231.   
  232. void MainWindow::on_helpBtn_clicked()  
  233. {  
  234.     QMessageBox::about(this, tr("帮助信息"), tr("1.选定好具体串口设置,点击打开串口即可收到信息" "\n"  
  235.                                               "2.防撞雷达项目小组共同努力制作" "\n"  
  236.                                               "3.Qt界面作者联系方式:周军 QQ: 380774082" "\n"  
  237.                                               "4.欢迎访问个人博客 http://blog.csdn.net/jjzhoujun2010"));  
  238. }  
  239.   
  240. // 通过终端板子串口将数据下传到数据采集板中  
  241. void MainWindow::on_inputBtn_clicked()  
  242. {  
  243.     QByteArray absoluteByte = ui->absoluteLineEdit->text().toAscii().data();  
  244.     QByteArray fastByte = ui->fastLineEdit->text().toAscii().data();  
  245. //    BYTE allByte_char[5] = {'0'};  
  246.     //QT中的回车只有一个字符\n,而windows下需要解释为\r\n;   根据FPGA接收端程序设计,需要中间加个0  
  247.     QByteArray allByte = absoluteByte + '0' + fastByte + '\r' + '\n';  
  248.     myCom->write(allByte);  
  249.   
  250.     qDebug()<<absoluteByte<<fastByte<<allByte;  
  251. }  

   coordinate.cpp文件中,由于我是在tabWidget里面绘图的,不能直接调用QPainter类,相应的解决方法有两种: 方法(1): 在子窗口ui.---派生一个类,在PaintEvent里画图。 我所遇到的问题:不清楚自己构造的派生类如何跟ui.---相关联起来,归根到底就是自己C++使用得不熟悉。 方法(2):事件过滤法。给ui.---安装事件监视器,在QEvent::paint事件时QPainter paint(ui->---)画图。我使用的是第二种方法。

  坐标图显示如下图4所示,由于在QT里面慢慢画直线、弧线等各种坐标点很麻烦,工作量大,因此我就确定好尺寸后,用PS自己弄了背景图片,计算好相应的坐标点,直接在上面显示目标点。

Qt开发串口通信以及坐标显示程序并移植_第4张图片

图4  坐标图显示


[cpp] view plain copy
  1. //*************************** coordinate.cpp *********************  
  2. #include "mainwindow.h"  
  3. #include "ui_mainwindow.h"  
  4. #include <QPainter>  
  5. #include <stdlib.h>  
  6. #include <QtCore/qmath.h>  
  7.   
  8.   
  9. // radarWidget中画图  
  10. bool MainWindow::eventFilter(QObject *obj, QEvent *e)  
  11. {  
  12.     if(obj == ui->radarWidget)  
  13.     {  
  14.         if(e->type() == QEvent::Paint)  
  15.         {  
  16.             draw();  
  17.             qDebug()<<"Workinggggggggggggggggggggggggggg................................";  
  18.             return true;  
  19.         }  
  20.         else  
  21.         {  
  22.             qDebug()<<"Waiting";  
  23.         }  
  24.     }  
  25.     return QMainWindow::eventFilter(obj, e);  
  26. }  
  27.   
  28. void MainWindow::draw()  
  29. {  
  30.     extern float floatData[20][2];      // 声明下在mainwindow.cpp里面定义的全局变量  
  31.     extern int dcFlag;                   // dcFlag = 1 时候相当不断刷新, 等于0时候相当于关闭,进行清屏操作,留背景  
  32.     extern int ti;  
  33.     QPainter painter(ui->radarWidget);  
  34.     QPixmap pix;  
  35.     pix.load(":/coordinate05-18.png");  
  36.     painter.drawPixmap(0, 0, 400, 440, pix);  
  37.   
  38.     painter.setBrush(Qt::red);              //先设定好画笔颜色  
  39.     painter.translate(194, 432);        // 变换坐标原点  
  40.   
  41.     float radian = 0.140;               //设定弧度,让其按照指定的角度偏移  
  42.   
  43.   
  44. //    dcFlag = 1;  
  45.   
  46.   
  47.     qDebug()<<dcFlag<<endl;  
  48.     if(dcFlag == 1)  
  49.     {  
  50.         int x = 0;  
  51.         // 2012-05-18,考虑角度偏移的坐标确定,改小号图像  
  52.         for(int j = 0; j < ti; j++)         // ti为全局变量  不能实时传送,只能当ti等于最后的数的时候才传过来??  
  53.         {  
  54.             x = int(floatData[j][0] / 10);  
  55.             switch(x)  
  56.             {  
  57.             case 0:  
  58.                 if(floatData[j][1] == 0)  
  59.                 {  
  60.                     painter.drawEllipse(0, -(floatData[j][0] * 4.5), 10, 10);               // 0m - 10m内,0度偏角  
  61.                 }  
  62.   
  63.                 else if(floatData[j][1] == 4)  
  64.                 {  
  65.                     painter.drawEllipse((floatData[j][0] * 4.5) * qSin(radian),  
  66.                                         -((floatData[j][0] * 4.5) * qCos(radian)), 10, 10);    // 4度偏角  
  67.                 }  
  68.   
  69.                 qDebug()<<(floatData[j][0] * 4.5)<<(floatData[j][0] * 4.5) * qSin(radian)  
  70.                        <<((floatData[j][0] * 4.5) * qCos(radian));  
  71.                 break;  
  72.             case 1:  
  73.                 if(floatData[j][1] == 0)  
  74.                     painter.drawEllipse(0, -(45 + (floatData[j][0] - 10) * 4.4), 10, 10);   // 10m - 20m内  
  75.                 else if(floatData[j][1] == 4)  
  76.                     painter.drawEllipse((45 + (floatData[j][0] - 10) * 4.4) * qSin(radian),  
  77.                                         -((45 + (floatData[j][0] - 10) * 4.4) * qCos(radian)), 10, 10);   // 10m - 20m内  
  78.                 break;  
  79.             case 2:  
  80.                 if(floatData[j][1] == 0)  
  81.                     painter.drawEllipse(0, -(89 + (floatData[j][0] - 20) * 4.2), 10, 10);  // 20m - 30m内  
  82.                 else if(floatData[j][1] == 4)  
  83.                     painter.drawEllipse((89 + (floatData[j][0] - 20) * 4.2) * qSin(radian),  
  84.                                         -(89 + (floatData[j][0] - 20) * 4.2) * qCos(radian), 10, 10);  
  85.                 break;  
  86.             case 3:  
  87.                 if(floatData[j][1] == 0)  
  88.                     painter.drawEllipse(0, -(131 + (floatData[j][0] - 30) * 4.2), 10, 10);  // 30m - 40m内  
  89.                 else if(floatData[j][1] == 4)  
  90.                     painter.drawEllipse((131 + (floatData[j][0] - 30) * 4.2) * qSin(radian),  
  91.                                         -(131 + (floatData[j][0] - 30) * 4.2) * qCos(radian), 10, 10);  // 4度偏角  
  92.                 break;  
  93.             case 4:  
  94.                 if(floatData[j][1] == 0)  
  95.                     painter.drawEllipse(0, -(174 + (floatData[j][0] - 40) * 4.3), 10, 10);  // 40m - 50m内  
  96.                 else if(floatData[j][1] == 4)  
  97.                     painter.drawEllipse((174 + (floatData[j][0] - 40) * 4.3) * qSin(radian),  
  98.                                         -(174 + (floatData[j][0] - 40) * 4.3) * qCos(radian), 10, 10);  // 4度偏角  
  99.                 break;  
  100.             case 5:  
  101.                 if(floatData[j][1] == 0)  
  102.                     painter.drawEllipse(0, -(218 + (floatData[j][0] - 50) * 4.4), 10, 10);  // 50m - 60m内  
  103.                 else if(floatData[j][1] == 4)  
  104.                     painter.drawEllipse((218 + (floatData[j][0] - 50) * 4.4) * qSin(radian),  
  105.                                         -(218 + (floatData[j][0] - 50) * 4.4) * qCos(radian), 10, 10);  
  106.                 break;  
  107.             case 6:  
  108.                 if(floatData[j][1] == 0)  
  109.                     painter.drawEllipse(0, -(261 + (floatData[j][0] - 60) * 4.3), 10, 10);  // 60m - 70m内  
  110.                 else if(floatData[j][1] == 4)  
  111.                     painter.drawEllipse((261 + (floatData[j][0] - 60) * 4.3) * qSin(radian),  
  112.                                         -(261 + (floatData[j][0] - 60) * 4.3) * qCos(radian), 10, 10);  
  113.                 break;  
  114.             case 7:  
  115.                 if(floatData[j][1] == 0)  
  116.                     painter.drawEllipse(0, -(305 + (floatData[j][0] - 70) * 4.4), 10, 10);  // 70m - 80m内  
  117.                 else if(floatData[j][1] == 4)  
  118.                     painter.drawEllipse((305 + (floatData[j][0] - 70) * 4.4) * qSin(radian),  
  119.                                         -(305 + (floatData[j][0] - 70) * 4.4) * qCos(radian), 10, 10);  
  120.                 break;  
  121.             case 8:  
  122.                 if(floatData[j][1] == 0)  
  123.                     painter.drawEllipse(0, -(343 + (floatData[j][0] - 80) * 3.8), 10, 10);  // 80m - 90m内  
  124.                 else if(floatData[j][1] == 4)  
  125.                     painter.drawEllipse((343 + (floatData[j][0] - 80) * 3.8) * qSin(radian),  
  126.                                         -(343 + (floatData[j][0] - 80) * 3.8) * qCos(radian), 10, 10);  
  127.                 break;  
  128.             case 9:  
  129.                 if(floatData[j][1] == 0)  
  130.                     painter.drawEllipse(0, -(378 + (floatData[j][0] - 90) * 3.5), 10, 10);  // 90m - 100m内  
  131.                 else if(floatData[j][1] == 4)  
  132.                     painter.drawEllipse((378 + (floatData[j][0] - 90) * 3.5) * qSin(radian),  
  133.                                         -(378 + (floatData[j][0] - 90) * 3.5) * qCos(radian), 10, 10);  
  134.                 break;  
  135.             case 10:  
  136.                 if(floatData[j][1] == 0)  
  137.                     painter.drawEllipse(0, -(410 + (floatData[j][0] - 100) * 3.2), 10, 10);  // 90m - 100m内  
  138.                 else if(floatData[j][1] == 4)  
  139.                     painter.drawEllipse((410 + (floatData[j][0] - 100) * 3.2) * qSin(radian),  
  140.                                         -(410 + (floatData[j][0] - 100) * 3.2) * qCos(radian), 10, 10);  
  141.                 break;  
  142.             default:  
  143.                 break;  
  144.             }  
  145.             qDebug()<<x<<floatData[j][0]<<floatData[j][1]<<j<<endl;  
  146.         }  
  147.   
  148.   
  149.         qDebug()<<ti<<endl;  
  150.   
  151.         // testing local coordinate  
  152.   
  153. //        painter.drawEllipse(0, 0, 10, 10);          // 0m  
  154. //        painter.drawEllipse(0, -(45), 10, 10);      // 10m  
  155. //        painter.drawEllipse(0, -(89), 10, 10);     // 20m  
  156. //        painter.drawEllipse(0, -(131), 10, 10);     // 30m  
  157. //        painter.drawEllipse(0, -(174), 10, 10);     // 40m  
  158. //        painter.drawEllipse(0, -(218), 10, 10);     // 50m  
  159. //        painter.drawEllipse(0, -(261), 10, 10);     // 60m  
  160. //        painter.drawEllipse(0, -(305), 10, 10);     // 70m  
  161. //        painter.drawEllipse(0, -(343), 10, 10);     // 80m  
  162. //        painter.drawEllipse(0, -(378), 10, 10);     // 90m  
  163. //        painter.drawEllipse(0, -(410), 10, 10);     // 100m  
  164. //  
  165. //        painter.drawEllipse(45 * qSin(radian), -(45 * qCos(radian)), 10, 10);    // 4度偏角  
  166. //        painter.drawEllipse(89 * qSin(radian), -(89 * qCos(radian)), 10, 10);    // 4度偏角  
  167. //        painter.drawEllipse(131 * qSin(radian), -(131 * qCos(radian)), 10, 10);    // 4度偏角  
  168. //        painter.drawEllipse(174 * qSin(radian), -(174 * qCos(radian)), 10, 10);    // 4度偏角  
  169. //        painter.drawEllipse(218 * qSin(radian), -(218 * qCos(radian)), 10, 10);    // 4度偏角  
  170. //        painter.drawEllipse(261 * qSin(radian), -(261 * qCos(radian)), 10, 10);    // 4度偏角  
  171. //        painter.drawEllipse(305 * qSin(radian), -(305 * qCos(radian)), 10, 10);    // 4度偏角  
  172. //        painter.drawEllipse(343 * qSin(radian), -(343 * qCos(radian)), 10, 10);    // 4度偏角  
  173. //        painter.drawEllipse(378 * qSin(radian), -(378 * qCos(radian)), 10, 10);    // 4度偏角  
  174. //        painter.drawEllipse(410 * qSin(radian), -(410 * qCos(radian)), 10, 10);    // 4度偏角  
  175.     }  
  176. }  


  main.cpp文件
[cpp] view plain copy
  1. //************************ main.cpp *****************//  
  2. // 2012-05-18 版本,去掉延时显示,进行实时显示,未完成的部分:1.坐标轴的坐标对应的地方,以及刷新的问题;2.调试界面的实现。  
  3.   
  4. #include <QtGui/QApplication>  
  5. #include <QTextCodec>       //加入头文件  
  6. #include "mainwindow.h"  
  7.   
  8. int main(int argc, char *argv[])  
  9. {  
  10.     QApplication a(argc, argv);  
  11.   
  12.     QTextCodec::setCodecForTr(QTextCodec::codecForLocale());    //使程序可处理中文  
  13.     QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));   // For Window 7  
  14. //    QTextCodec::setCodecForTr(QTextCodec::codecForName("System")); // For all  
  15.   
  16. //    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));  
  17. //    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));  
  18.     MainWindow w;  
  19.     w.show();  
  20.   
  21.     return a.exec();  
  22. }  

三、Linux版本

  我是在Fedora9 里面进行Linux版本的编写的,只需把相应的第三方类修改,相对应的定义也改掉,串口名称那里也要改,并添加前缀“/dev”,其他部分相同。

四、移植到Mini6410上面运行

  移植前需要修改下项目文件里ui的串口名称,改成ttySAC0, ttySAC1....之类的,然后在安装了交叉编译链,Qt4.7交叉编译环境后,在Qt里面选择对应的编译链进行编译,具体做法参见《Mini6410 Qt4和Qtopia编程开发指南》。

五、总结

  从接手项目任务到完成大概花了3个月时间,期间由于其他事情断断续续地编程,Qt知识是从零开始学习的,以及由于个人C++水平有限,编写的程序可能会不合理的地方,忘高手指导。通过完成此次的项目,我对于C++的学习又深入一步,以及学会了Qt这种跨平台的SDK。我会分别把Windows版本,Linux版本的源文件上传上来,供大家参考,互相学习。(备注:Linux版本的由于当初是直接在实验室弄好,跟今天修改的Windows版本略有不同,因为当初是为了考虑嵌入式开发板的屏幕小,把选择串口参数部分去掉,直接在程序里面默认设定好了,需要修改的同学直接在里面修改即可。)
Windows版本:http://download.csdn.net/detail/jjzhoujun2010/4393863
Linux版本:http://download.csdn.net/detail/jjzhoujun2010/4393867

Mini6410 Qt4和Qtopia编程开发指南》:http://download.csdn.net/detail/jjzhoujun2010/4393908

转自:blog.csdn.net/jjzhoujun2010

作者:Dream Fly


你可能感兴趣的:(linux,windows,qt,float,终端,Signal)