九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
Linux下 QT 實(shí)現(xiàn)串口通訊小實(shí)例

Linux下 QT 實(shí)現(xiàn)串口通訊小實(shí)例

2011-06-22 17:36 佚名 互聯(lián)網(wǎng) 我要評論(0) 字號:T | T

本文介紹的是Linux下 QT 實(shí)現(xiàn)串口通訊小實(shí)例,本文基本沒有介紹,基于代碼實(shí)現(xiàn)串口通訊。請先看代碼。

AD:

Linux QT 實(shí)現(xiàn)串口通訊小實(shí)例,代碼如下

  1. view plaincopy to clipboardprint?  
  2. //ui_mainwindow.h     
  3. #ifndef UI_MAINWINDOW_H     
  4. #define UI_MAINWINDOW_H     
  5. #include <QtCore/QVariant>     
  6. #include <QtGui/QAction>     
  7. #include <QtGui/QApplication>     
  8. #include <QtGui/QButtonGroup>     
  9. #include <QtGui/QHeaderView>     
  10. #include <QtGui/QLabel>     
  11. #include <QtGui/QMainWindow>     
  12. #include <QtGui/QMenuBar>     
  13. #include <QtGui/QPushButton>     
  14. #include <QtGui/QStatusBar>     
  15. #include <QtGui/QToolBar>     
  16. #include <QtGui/QWidget>     
  17. QT_BEGIN_NAMESPACE     
  18. class Ui_MainWindow     
  19. {     
  20. public:     
  21.     QWidget *centralWidget;     
  22.     QPushButton *writeButton;     
  23.     QPushButton *readButton;     
  24.     QPushButton *closeButton;     
  25.     QLabel *dis_label;     
  26.     QMenuBar *menuBar;     
  27.     QToolBar *mainToolBar;     
  28.     QStatusBar *statusBar;     
  29.     
  30.     void setupUi(QMainWindow *MainWindow)     
  31.     {     
  32.         if (MainWindow->objectName().isEmpty())     
  33.             MainWindow->setObjectName(QString::fromUtf8("MainWindow"));     
  34.         MainWindow->resize(600, 400);     
  35.         centralWidget = new QWidget(MainWindow);     
  36.         centralWidget->setObjectName(QString::fromUtf8("centralWidget"));     
  37.         writeButton = new QPushButton(centralWidget);     
  38.         writeButton->setObjectName(QString::fromUtf8("writeButton"));     
  39.         writeButton->setGeometry(QRect(100, 210, 75, 23));     
  40.         readButton = new QPushButton(centralWidget);     
  41.         readButton->setObjectName(QString::fromUtf8("readButton"));     
  42.         readButton->setGeometry(QRect(240, 210, 75, 23));     
  43.         closeButton = new QPushButton(centralWidget);     
  44.         closeButton->setObjectName(QString::fromUtf8("closeButton"));     
  45.         closeButton->setGeometry(QRect(390, 210, 75, 23));     
  46.         dis_label = new QLabel(centralWidget);     
  47.         dis_label->setObjectName(QString::fromUtf8("dis_label"));     
  48.         dis_label->setGeometry(QRect(200, 90, 191, 16));     
  49.         MainWindow->setCentralWidget(centralWidget);     
  50.         menuBar = new QMenuBar(MainWindow);     
  51.         menuBar->setObjectName(QString::fromUtf8("menuBar"));     
  52.         menuBar->setGeometry(QRect(0, 0, 600, 19));     
  53.         MainWindow->setMenuBar(menuBar);     
  54.         mainToolBar = new QToolBar(MainWindow);     
  55.         mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));     
  56.         MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);     
  57.         statusBar = new QStatusBar(MainWindow);     
  58.         statusBar->setObjectName(QString::fromUtf8("statusBar"));     
  59.         MainWindow->setStatusBar(statusBar);     
  60.     
  61.         retranslateUi(MainWindow);     
  62.     
  63.         QMetaObject::connectSlotsByName(MainWindow);     
  64.     } // setupUi     
  65.     
  66.     void retranslateUi(QMainWindow *MainWindow)     
  67.     {     
  68.         MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));     
  69.         writeButton->setText(QApplication::translate("MainWindow", "PushButton", 0, QApplication::UnicodeUTF8));     
  70.         readButton->setText(QApplication::translate("MainWindow", "PushButton", 0, QApplication::UnicodeUTF8));     
  71.         closeButton->setText(QApplication::translate("MainWindow", "PushButton", 0, QApplication::UnicodeUTF8));     
  72.         dis_label->setText(QApplication::translate("MainWindow", "TextLabel", 0, QApplication::UnicodeUTF8));     
  73.     } // retranslateUi     
  74.     
  75. };     
  76. namespace Ui {     
  77.     class MainWindow: public Ui_MainWindow {};     
  78. } // namespace Ui     
  79. QT_END_NAMESPACE     
  80. #endif // UI_MAINWINDOW_H     
  81. //thread.h     
  82. #ifndef THREAD_H     
  83. #define THREAD_H     
  84. #include<QThread>     
  85. class Thread:public QThread     
  86. {     
  87.   Q_OBJECT     
  88.  public:     
  89.   Thread();     
  90.   char buf[128];     
  91.   volatile bool stopped;     
  92.   volatile bool write_rs;     
  93.   volatile bool read_rs;     
  94.  protected:     
  95.   virtual void run();     
  96. };     
  97. #endif     
  98. //thread.cpp     
  99. #include"thread.h"     
  100. #include <sys/types.h>     
  101. #include <sys/stat.h>     
  102. #include <fcntl.h>     
  103. #include <termios.h>    //串口用到的     
  104. #include <stdio.h>     
  105. #include <stdlib.h>     
  106. #include <unistd.h>     
  107. #include <strings.h>     
  108. #define BAUDRATE B9600     
  109. #define RS_DEVICE "/dev/ttyS0"       //串口0     
  110. //#define RS_DEVICE "/dev/ttySAC1"       //串口1     
  111. Thread::Thread()     
  112. {}                                                 //析構(gòu)     
  113. void Thread::run()          //這就是線程的具體工作了     
  114. {     
  115.  int fd,c=0,res;     
  116. struct termios oldtio,newtio;     //termios結(jié)構(gòu)是用來保存波特率、字符大小等     
  117. printf("start...\n");     
  118. fd=open(RS_DEVICE,O_RDWR|O_NOCTTY);     //以讀寫方式打開串口。不控制TTY     
  119. if(fd<0)     
  120. {     
  121. perror("error");     
  122. exit(1);                             //失敗退出     
  123. }     
  124. printf("Open...\n");     
  125. tcgetattr(fd,&oldtio);             //保存當(dāng)前設(shè)置到oldtio     
  126. bzero(&newtio,sizeof(newtio));     //清除newtio結(jié)構(gòu),并重新對它的成員設(shè)置如下    
  127. newtio.c_cflag=BAUDRATE|CS8|CLOCAL|CREAD;  //9600、8位、忽略DCD信號、啟用接收裝置     
  128. newtio.c_iflag|=IGNPAR;                    //忽略奇偶     
  129. newtio.c_oflag=0;     
  130. newtio.c_lflag=0;     
  131. newtio.c_cc[VMIN]=0;     
  132. newtio.c_cc[VTIME]=100;                   //在規(guī)定時間(VTIME)內(nèi)讀取(VMIN)個字符;     
  133. tcflush(fd,TCIFLUSH);                    //清除所有隊列在串口的輸入與輸出;     
  134. tcsetattr(fd,TCSANOW,&newtio);           //把我們的設(shè)置寫入termios     
  135. while(stopped)                          //stopped為0時將退出線程     
  136. {     
  137.  if(write_rs)                           //write_rs為1時把字符串從串口中輸出     
  138. {     
  139. write_rs=0;     
  140. write(fd,"QtEmbedded-4.5.1",16);  //向串口中寫入字符,通過串口調(diào)試助手可看到QtEmbedded-4.5.1這個字符     
  141. }     
  142.  if(read_rs)                           //read_rs為1時讀取,并存在buf     
  143. {     
  144. read_rs=0;     
  145. res=read(fd,buf,10);     //讀取串口的數(shù)據(jù)到buf     
  146. buf[res]=0;     
  147. emit finished();                      //讀完后發(fā)一個信號     
  148. }     
  149. }     
  150. printf("Close...\n");     
  151. tcsetattr(fd,TCSANOW,&oldtio);      //重新設(shè)置回原來的     
  152. close(fd);     
  153. quit();     
  154. }     
  155. //mainwindow.h     
  156. #ifndef MAINWINDOW_H     
  157. #define MAINWINDOW_H     
  158. #include<QtGui>     
  159. #include"ui_mainwindow.h"    //奇怪?這個頭文件從哪里來的?呵呵,剛才用designer做的mainwindow.ui文件,經(jīng)過make后會生成這個頭文件,     
  160. #include"thread.h"           //把我們前面定義的線程包含進(jìn)來     
  161. class MainWindow:public QMainWindow,public Ui::MainWindow  //多繼承     
  162. {     
  163.   Q_OBJECT     
  164.  public:     
  165.   MainWindow(QWidget *parent=0);     
  166.  public slots:     
  167.   void writeThread();     
  168.   void readThread();     
  169.   void closeThread();     
  170.   void display();    
  171.  private:     
  172.   Thread *yy;     
  173. };     
  174. #endif     
  175. //mainwindow.cpp     
  176. #include"mainwindow.h"    
  177. MainWindow::MainWindow(QWidget *parent)     
  178.   :QMainWindow(parent)     
  179. {     
  180.   setupUi(this);     
  181.   yy = new Thread;     
  182.   yy->start();          //啟動線程     
  183.   yy->stopped=1;        //初始化變量     
  184.   yy->write_rs=0;     
  185.   yy->read_rs=0;     
  186.   connect(writeButton,SIGNAL(clicked()),this,SLOT(writeThread()));      //信號與槽     
  187.   connect(readButton,SIGNAL(clicked()),this,SLOT(readThread()));     
  188.   connect(closeButton,SIGNAL(clicked()),this,SLOT(closeThread()));     
  189.   connect(yy,SIGNAL(finished()),this,SLOT(display()));      //前面線程讀完了不是發(fā)一個信號么,這個信號就是發(fā)到這個槽     
  190. }     
  191. void MainWindow::display()     
  192. {     
  193. dis_label->setText(yy->buf);     //讀到的在dis_label顯示,dis_label就是我們前面designer放的標(biāo)簽,顯示buf中的內(nèi)容     
  194. }     
  195. void MainWindow::writeThread()  //前面線程都是根據(jù)stopped、write_rs、read_rs的狀態(tài)來工作的^_^     
  196. {     
  197.   yy->write_rs=1;     
  198. }    
  199. void MainWindow::readThread()     
  200. {     
  201.   yy->read_rs=1;     
  202. }     
  203. void MainWindow::closeThread()     
  204. {     
  205. yy->stopped=0;     
  206. }     
  207. //main.cpp     
  208. #include<QApplication>     
  209. #include"mainwindow.h"     
  210. int main(int argc,char *argv[])     
  211. {     
  212.   QApplication app(argc,argv);     
  213.   MainWindow mw;     
  214.   mw.show();     
  215.   return app.exec();     
  216. }    
  217. //ui_mainwindow.h  
  218. #ifndef UI_MAINWINDOW_H  
  219. #define UI_MAINWINDOW_H  
  220. #include <QtCore/QVariant> 
  221. #include <QtGui/QAction> 
  222. #include <QtGui/QApplication> 
  223. #include <QtGui/QButtonGroup> 
  224. #include <QtGui/QHeaderView> 
  225. #include <QtGui/QLabel> 
  226. #include <QtGui/QMainWindow> 
  227. #include <QtGui/QMenuBar> 
  228. #include <QtGui/QPushButton> 
  229. #include <QtGui/QStatusBar> 
  230. #include <QtGui/QToolBar> 
  231. #include <QtGui/QWidget> 
  232. QT_BEGIN_NAMESPACE  
  233. class Ui_MainWindow  
  234. {  
  235. public:  
  236.     QWidget *centralWidget;  
  237.     QPushButton *writeButton;  
  238.     QPushButton *readButton;  
  239.     QPushButton *closeButton;  
  240.     QLabel *dis_label;  
  241.     QMenuBar *menuBar;  
  242.     QToolBar *mainToolBar;  
  243.     QStatusBar *statusBar;  
  244.  
  245.     void setupUi(QMainWindow *MainWindow)  
  246.     {  
  247.         if (MainWindow->objectName().isEmpty())  
  248.             MainWindow->setObjectName(QString::fromUtf8("MainWindow"));  
  249.         MainWindow->resize(600, 400);  
  250.         centralWidget = new QWidget(MainWindow);  
  251.         centralWidget->setObjectName(QString::fromUtf8("centralWidget"));  
  252.         writeButton = new QPushButton(centralWidget);  
  253.         writeButton->setObjectName(QString::fromUtf8("writeButton"));  
  254.         writeButton->setGeometry(QRect(100, 210, 75, 23));  
  255.         readButton = new QPushButton(centralWidget);  
  256.         readButton->setObjectName(QString::fromUtf8("readButton"));  
  257.         readButton->setGeometry(QRect(240, 210, 75, 23));  
  258.         closeButton = new QPushButton(centralWidget);  
  259.         closeButton->setObjectName(QString::fromUtf8("closeButton"));  
  260.         closeButton->setGeometry(QRect(390, 210, 75, 23));  
  261.         dis_label = new QLabel(centralWidget);  
  262.         dis_label->setObjectName(QString::fromUtf8("dis_label"));  
  263.         dis_label->setGeometry(QRect(200, 90, 191, 16));  
  264.         MainWindow->setCentralWidget(centralWidget);  
  265.         menuBar = new QMenuBar(MainWindow);  
  266.         menuBar->setObjectName(QString::fromUtf8("menuBar"));  
  267.         menuBar->setGeometry(QRect(0, 0, 600, 19));  
  268.         MainWindow->setMenuBar(menuBar);  
  269.         mainToolBar = new QToolBar(MainWindow);  
  270.         mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));  
  271.         MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);  
  272.         statusBar = new QStatusBar(MainWindow);  
  273.         statusBar->setObjectName(QString::fromUtf8("statusBar"));  
  274.         MainWindow->setStatusBar(statusBar);  
  275.         retranslateUi(MainWindow);  
  276.         QMetaObject::connectSlotsByName(MainWindow);  
  277.     } // setupUi  
  278.     void retranslateUi(QMainWindow *MainWindow)  
  279.     {  
  280.         MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));  
  281.         writeButton->setText(QApplication::translate("MainWindow", "PushButton", 0, QApplication::UnicodeUTF8));  
  282.         readButton->setText(QApplication::translate("MainWindow", "PushButton", 0, QApplication::UnicodeUTF8));  
  283.         closeButton->setText(QApplication::translate("MainWindow", "PushButton", 0, QApplication::UnicodeUTF8));  
  284.         dis_label->setText(QApplication::translate("MainWindow", "TextLabel", 0, QApplication::UnicodeUTF8));  
  285.     } // retranslateUi  
  286. };  
  287. namespace Ui {  
  288.     class MainWindow: public Ui_MainWindow {};  
  289. } // namespace Ui  
  290. QT_END_NAMESPACE  
  291. #endif // UI_MAINWINDOW_H  
  292. //thread.h  
  293. #ifndef THREAD_H  
  294. #define THREAD_H  
  295. #include<QThread> 
  296. class Thread:public QThread  
  297. {  
  298.   Q_OBJECT  
  299.  public:  
  300.   Thread();  
  301.   char buf[128];  
  302.   volatile bool stopped;  
  303.   volatile bool write_rs;  
  304.   volatile bool read_rs;  
  305.  protected:  
  306.   virtual void run();  
  307. };  
  308. #endif  
  309. //thread.cpp  
  310. #include"thread.h"  
  311. #include <sys/types.h> 
  312. #include <sys/stat.h> 
  313. #include <fcntl.h> 
  314. #include <termios.h>    //串口用到的  
  315. #include <stdio.h> 
  316. #include <stdlib.h> 
  317. #include <unistd.h> 
  318. #include <strings.h> 
  319. #define BAUDRATE B9600  
  320. #define RS_DEVICE "/dev/ttyS0"       //串口0  
  321. //#define RS_DEVICE "/dev/ttySAC1"       //串口1  
  322. Thread::Thread()  
  323. {}                    //析構(gòu)  
  324. void Thread::run()       //這就是線程的具體工作了  
  325. {  
  326.  int fd,c=0,res;  
  327. struct termios oldtio,newtio;     //termios結(jié)構(gòu)是用來保存波特率、字符大小等  
  328. printf("start...\n");  
  329. fd=open(RS_DEVICE,O_RDWR|O_NOCTTY);     //以讀寫方式打開串口。不控制TTY  
  330. if(fd<0)  
  331. {  
  332. perror("error");  
  333. exit(1);                             //失敗退出  
  334. }  
  335. printf("Open...\n");  
  336. tcgetattr(fd,&oldtio);             //保存當(dāng)前設(shè)置到oldtio  
  337. bzero(&newtio,sizeof(newtio));     //清除newtio結(jié)構(gòu),并重新對它的成員設(shè)置如下  
  338. newtio.c_cflag=BAUDRATE|CS8|CLOCAL|CREAD;  //9600、8位、忽略DCD信號、啟用接收裝置  
  339. newtio.c_iflag|=IGNPAR;                    //忽略奇偶  
  340. newtio.c_oflag=0;  
  341. newtio.c_lflag=0;  
  342. newtio.c_cc[VMIN]=0;  
  343. newtio.c_cc[VTIME]=100;                   //在規(guī)定時間(VTIME)內(nèi)讀取(VMIN)個字符;  
  344. tcflush(fd,TCIFLUSH);                    //清除所有隊列在串口的輸入與輸出;  
  345. tcsetattr(fd,TCSANOW,&newtio);           //把我們的設(shè)置寫入termios  
  346. while(stopped)                          //stopped為0時將退出線程  
  347. {  
  348.  if(write_rs)                           //write_rs為1時把字符串從串口中輸出  
  349. {  
  350. write_rs=0;  
  351. write(fd,"QtEmbedded-4.5.1",16);  //向串口中寫入字符,通過串口調(diào)試助手可看到QtEmbedded-4.5.1這個字符  
  352. }  
  353.  if(read_rs)                           //read_rs為1時讀取,并存在buf  
  354. {  
  355. read_rs=0;  
  356. res=read(fd,buf,10);     //讀取串口的數(shù)據(jù)到buf  
  357. buf[res]=0;  
  358. emit finished();                      //讀完后發(fā)一個信號  
  359. }  
  360. }  
  361. printf("Close...\n");  
  362. tcsetattr(fd,TCSANOW,&oldtio);      //重新設(shè)置回原來的  
  363. close(fd);  
  364. quit();  
  365. }  
  366. //mainwindow.h  
  367. #ifndef MAINWINDOW_H  
  368. #define MAINWINDOW_H  
  369. #include<QtGui> 
  370. #include"ui_mainwindow.h"    //奇怪?這個頭文件從哪里來的?呵呵,剛才用designer做的mainwindow.ui文件,經(jīng)過make后會生成這個頭文件,  
  371. #include"thread.h"        //把我們前面定義的線程包含進(jìn)來  
  372. class MainWindow:public QMainWindow,public Ui::MainWindow  //多繼承  
  373. {  
  374.   Q_OBJECT  
  375.  public:  
  376.   MainWindow(QWidget *parent=0);  
  377.  public slots:  
  378.   void writeThread();  
  379.   void readThread();  
  380.   void closeThread();  
  381.   void display();  
  382.  private:  
  383.   Thread *yy;  
  384. };  
  385. #endif  
  386. //mainwindow.cpp  
  387. #include"mainwindow.h"  
  388. MainWindow::MainWindow(QWidget *parent)  
  389.   :QMainWindow(parent)  
  390. {  
  391.   setupUi(this);  
  392.   yy = new Thread;  
  393.   yy->start();          //啟動線程  
  394.   yy->stopped=1;        //初始化變量  
  395.   yy->write_rs=0;  
  396.   yy->read_rs=0;  
  397.   connect(writeButton,SIGNAL(clicked()),this,SLOT(writeThread()));      //信號與槽  
  398.   connect(readButton,SIGNAL(clicked()),this,SLOT(readThread()));  
  399.   connect(closeButton,SIGNAL(clicked()),this,SLOT(closeThread()));  
  400.   connect(yy,SIGNAL(finished()),this,SLOT(display()));      //前面線程讀完了不是發(fā)一個信號么,這個信號就是發(fā)到這個槽  
  401. }  
  402. void MainWindow::display()  
  403. {  
  404. dis_label->setText(yy->buf);     //讀到的在dis_label顯示,dis_label就是我們前面designer放的標(biāo)簽,顯示buf中的內(nèi)容  
  405. }  
  406. void MainWindow::writeThread()  //前面線程都是根據(jù)stopped、write_rs、read_rs的狀態(tài)來工作的^_^  
  407. {  
  408.   yy->write_rs=1;  
  409. }  
  410. void MainWindow::readThread()  
  411. {  
  412.   yy->read_rs=1;  
  413. }  
  414. void MainWindow::closeThread()  
  415. {  
  416. yy->stopped=0;  
  417. }  
  418. //main.cpp  
  419. #include<QApplication> 
  420. #include"mainwindow.h"  
  421. int main(int argc,char *argv[])  
  422. {  
  423.   QApplication app(argc,argv);  
  424.   MainWindow mw;  
  425.   mw.show();  
  426.   return app.exec();  

本例中用到了線程,線程有一個好處就是可以單獨(dú)的去掃描串行端口,當(dāng)有數(shù)據(jù)發(fā)送到端口時,顯示相應(yīng)的字符到顯示框中。使用時注意波特率和串口的設(shè)置,這里用的波特率是9600,串口時ttyS0。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
pyqt中使用matplotlib繪制動態(tài)曲線
PyQt---結(jié)合python與QT的GUI編程
python 模擬瀏覽器
Qt namespace Ui
QT 線程暫停,繼續(xù)執(zhí)行的一種實(shí)現(xiàn)
QT程序初始化時QDockWidget大小的調(diào)整方法
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服