当前位置:文档之家› QT串口通讯编程及雷达坐标

QT串口通讯编程及雷达坐标

QT串口通讯编程及雷达坐标
QT串口通讯编程及雷达坐标

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

一. 项目介绍

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

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

图 1 Windows版本图2 Linux版本

编写控制Qt串口通信终端界面时候,串口通信部分是参考yafeilinux的串口通信教程:https://www.doczj.com/doc/544643629.html,/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,定义声明了各种类和变量。

[cpp] view plaincopy

01.//******************* mainwindow.h ************//

02.#ifndef MAINWINDOW_H

03.#define MAINWINDOW_H

04.

05.#include

06.#include

07.#include

08.//#include "posix_qextserialport.h"

09.#include "win_qextserialport.h"

10.#include

11.#include

12.#include

13.

https://www.doczj.com/doc/544643629.html,space 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 plaincopy

01.//****************************** mainwindow.cpp *****************//

02.#include "mainwindow.h"

03.#include "ui_mainwindow.h"

04.#include

05.#include

06.#include

07.

08.float QBArray2Float(QByteArray temp);

09.

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"<

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"<

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

159. else if(ui->dataBitsComboBox->currentText() == tr("7"))

160. myCom->setDataBits(DA TA_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.欢迎访问个人博客https://www.doczj.com/doc/544643629.html,/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()<

251.}

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

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

图4 坐标图显示

[cpp] view plaincopy

01.//*************************** coordinate.cpp *********************

02.#include "mainwindow.h"

03.#include "ui_mainwindow.h"

04.#include

05.#include

06.#include

07.

08.

09.// 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()<

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

146. }

147.

148.

149. qDebug()<

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 plaincopy

01.//************************ main.cpp *****************//

02.// 2012-05-18 版本,去掉延时显示,进行实时显示,未完成的部分:1.坐标轴的坐标对应的地方,以及刷新的问题;2.调试界面的实现。

03.

04.#include

05.#include //加入头文件

06.#include "mainwindow.h"

07.

08.int main(int argc, char *argv[])

09.{

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版本:https://www.doczj.com/doc/544643629.html,/detail/jjzhoujun2010/4393863

Linux版本:https://www.doczj.com/doc/544643629.html,/detail/jjzhoujun2010/4393867

《Mini6410 Qt4和Qtopia编程开发指南》:https://www.doczj.com/doc/544643629.html,/detail/jjzhoujun2010/4393908

转自:https://www.doczj.com/doc/544643629.html,/jjzhoujun2010

作者:Dream Fly

相关主题
文本预览
相关文档 最新文档