簡介:上位機通過RS232串口發(fā)送消息給下位機,下位機收到消息并做出2個動作:
(1)LED燈變化。
(2)將消息通過RS232串口返回給上位機;
上位機收到消息后將內(nèi)容顯示在UI界面上。
windows7 64位環(huán)境完整源碼及源程序打包下載: https://download.csdn.net/download/robin_xx/10791050
主要代碼粘貼如下:
PIC單片機下位機源程序:
#include __CONFIG(HS&WDTDIS&LVPDIS); unsigned char i=0; //void interrupt ISR(void); void interrupt usart(void); void Init(void); //初始化 unsigned char* sendData=""; const unsigned char led10[]=//8個led流水燈碼表 { 0B00000000, 0B00000001, 0B00000010, 0B00000100, 0B00001000, 0B00010000, 0B00100000, 0B01000000, 0B10000000, 0B11111111 }; void main(void) { Init(); while(1) { if (i==10) i=0; PORTB=led10[i]; } } /*void interrupt ISR(void)// { if(INTF==1)//按鍵中斷 { INTF=0;//清中斷標(biāo)志位 i+=1;//每次產(chǎn)生中斷時流水燈從頭開始點亮 } }*/ void interrupt usart(void) { if(RCIE&&RCIF) //判斷是否為串口接收中斷 { i+=1; while(!TRMT);//等待接受完畢 sendData=RCREG; //i=sendData; } if(sendData!="") { RCIE=0;//發(fā)送前關(guān)閉接受中斷使能位 TXREG = sendData; //把接收到的數(shù)據(jù)發(fā)送回去 while(!TXIF);//等待發(fā)送完成 RCIE = 1;//發(fā)送完成開啟接收中斷使能位 sendData=""; } } void Init(void) { TRISB=0B00000000;//控制8個LED,輸出口 PORTB=0B00000000;// //初始化端口程序 TRISC7 = 1; //RX端口設(shè)為輸入有效 TRISC6 = 0; //TX端口設(shè)為輸出有效 //SPBRG = 0X19; //設(shè)置波特率為9600BPS SPBRG = 0XC; //設(shè)置波特率為19200BPS //TXSTA = 0x04; //異步通訊-禁止發(fā)送數(shù)據(jù)-高速模式 TXSTA = 0X24; //使能串口發(fā)送,選擇高速波特率 //RCSTA = 0xA0; //串口使能-接收單字符-禁止連續(xù)接受 RCSTA = 0X90; //使能串口工作,連續(xù)接收 RCIE=0X1; //使能接收中斷 GIE=0X1; //開放全局中斷 PEIE=0X1; //使能外部中斷 } QT上位機源程序: mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: QSerialPort *serial; explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_pushButton_send_clicked(); void on_pushButton_openPort_clicked(); void read_Com(); void on_pushButton_ClearRec_clicked(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) { QSerialPort serial; serial.setPort(info); //判斷串口能否打開 if(serial.open(QIODevice::ReadWrite)) { QString portStr = info.portName(); ui->comboBox_portList->addItem(portStr); serial.close(); } } ui->comboBox_portList->setCurrentIndex(0); ui->comboBox_BPS->addItem("7200"); ui->comboBox_BPS->addItem("9600"); ui->comboBox_BPS->addItem("14400"); ui->comboBox_BPS->addItem("19200"); ui->comboBox_BPS->addItem("38400"); ui->comboBox_BPS->addItem("57600"); ui->comboBox_BPS->setCurrentIndex(3); on_pushButton_openPort_clicked(); on_pushButton_openPort_clicked(); } MainWindow::~MainWindow() { delete ui; } //讀取接收到的信息 void MainWindow::read_Com() { QByteArray temp=serial->readAll(); if(!temp.isEmpty())//如果讀到的數(shù)據(jù)不為空 { ui->textBrowser_RecList->insertPlainText(temp); } } //發(fā)送按鈕槽函數(shù) void MainWindow::on_pushButton_send_clicked() { QString str=ui->lineEdit_sendText->text();//從LineEdit得到字符串 if(str!="") { ui->textBrowser_RecList->insertPlainText("n"); serial->write(str.toLatin1());//以ASCII碼形式將數(shù)據(jù)寫入串口 //ui->lineEdit_sendText->clear(); } } void MainWindow::on_pushButton_openPort_clicked() { if(ui->comboBox_portList->isEnabled()) { ui->pushButton_openPort->setText("ClosePort"); //按下“OpenPort”后,按鍵顯示為“ClosePort” ui->comboBox_portList->setDisabled(true); //按下“OpenPort”后,禁止再修改COM口 serial = new QSerialPort; //設(shè)置串口名 serial->setPortName(ui->comboBox_portList->currentText()); ui->textBrowser_RecList->insertPlainText("nNowPort:"+ui->comboBox_portList->currentText()); //自動尋找可用串口的方法 //先關(guān)串口,再打開,可以保證串口不被其它函數(shù)占用。 //serial->close(); //打開串口 serial->open(QIODevice::ReadWrite); //設(shè)置波特率 serial->setBaudRate(ui->comboBox_BPS->currentText().toInt()); ui->comboBox_BPS->setDisabled(true); //設(shè)置數(shù)據(jù)位數(shù) (8) serial->setDataBits(QSerialPort::Data8); //設(shè)置校驗位(如0) serial->setParity(QSerialPort::NoParity); //設(shè)置停止位(如1) serial->setStopBits(QSerialPort::OneStop); //設(shè)置流控制(無) serial->setFlowControl(QSerialPort::NoFlowControl); //把串口的readyRead()信號綁定到read_Com()這個槽函數(shù)上 connect(serial,SIGNAL(readyRead()),this,SLOT(read_Com())); } else { ui->pushButton_openPort->setText("OpenPort"); //按下“ClosePort”后,按鍵顯示為“OpenPort” ui->comboBox_portList->setEnabled(true); //按下“ClosePort”后,COM口可被修改 ui->comboBox_BPS->setEnabled(true); serial->close(); //關(guān)串口 } } void MainWindow::on_pushButton_ClearRec_clicked() { ui->textBrowser_RecList->clear(); } main.cpp #include "mainwindow.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } UI界面: windows7 64位環(huán)境完整源碼及源程序打包下載: https://download.csdn.net/download/robin_xx/10791050
上一篇:PIC單片機入門筆記(新手學(xué)PIC必看)——基于PIC16F886
下一篇:PIC單片機的指針
推薦閱讀
史海拾趣
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 中國研究人員發(fā)明全新動作好奇心算法 增強不確定環(huán)境下的自主導(dǎo)航
- 技術(shù)解析|沃爾沃XC70超級混動有什么亮點?
- 小米汽車:磁吸物理按鍵已接入米家,可通過APP操控
- 專家專論 | 顧劍民:L2級輔助駕駛激光雷達“價格歸零”
- 近一個月投資五家!京東密集落子具身智能機器人賽道
- 海外動力電池裝車量TOP10:3家落榜 一新上榜中企暴增逾10倍
- 吉利汽車:全域AI守護輔助駕駛安全
- 松下汽車系統(tǒng)與VicOne深化合作 共拓新一代智能座艙系統(tǒng)安全創(chuàng)新
- 汽車MCU的“芯”浪潮
- 具身智能如何大規(guī)模推廣?丨具身智能機器人高質(zhì)量發(fā)展
- 【DIY數(shù)控電源】入圍方案及后續(xù)活動安排!
- 有獎直播|魏德米勒 OMNIMATE® 聯(lián)接技術(shù)的創(chuàng)新發(fā)展
- 新春尋寶記,泰克送福利!快來開啟你的尋寶之旅~
- 又到一年總結(jié)時——EE社區(qū)送溫暖
- 【MPS有獎分享】便攜式多功能電工臺的核“芯”功能測試與結(jié)構(gòu)設(shè)計
- 報名參會三重禮 | 西門子車用半導(dǎo)體全棧解決方案直播
- TI 電機驅(qū)動應(yīng)用闖關(guān)答題賽
- 揭秘正確選擇探頭的5大要素 (泰克原裝探頭促銷,高貴不貴,199元起)
- 2024年STM32巡回研討會即將開啟!(9月3日-9月13日)
- 機器人市場持續(xù)火熱,服務(wù)機器人能成為家庭剛需
- 3C智能制造的不斷發(fā)展和創(chuàng)新,推動了并聯(lián)機器人的國產(chǎn)化
- 特斯拉與合作伙伴發(fā)現(xiàn)新鋰電池技術(shù)路線
- Viziblezone系統(tǒng)可探測到150米外“隱藏行人”保護行人安全
- 海拉開發(fā)復(fù)雜照明系統(tǒng)綜合解決方案“LIGHT DESIGN”降低集成成本
- 基于單片機PWM的直流電機調(diào)速系統(tǒng)+H橋驅(qū)動電路驅(qū)動原理圖
- 在無人機制導(dǎo)、導(dǎo)航與控制中應(yīng)用半實物仿真
- 基于GPRS的ZigBee協(xié)調(diào)器網(wǎng)關(guān)設(shè)計通信
- 對PWM電路關(guān)鍵點波形進行自動測量并輸出的判斷
- LabVIEW應(yīng)用于車輛通過噪聲測試的聲學(xué)波束成形