基于RS232串口实现PIC单片机下位机与QT上位机通信
2018-11-17 19:30
555 查看
简介:上位机通过RS232串口发送消息给下位机,下位机收到消息并做出2个动作:
(1)LED灯变化。
(2)将消息通过RS232串口返回给上位机;
上位机收到消息后将内容显示在UI界面上。
windows7 64位环境完整源码及源程序打包下载: https://download.csdn.net/download/robin_xx/10791050
主要代码粘贴如下:
PIC单片机下位机源程序:
[code]#include<pic.h> __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;//清中断标志位 i+=1;//每次产生中断时流水灯从头开始点亮 } }*/ void interrupt usart(void) { if(RCIE&&RCIF) //判断是否为串口接收中断 { i+=1; while(!TRMT);//等待接受完毕 sendData=RCREG; //i=sendData; } if(sendData!="") { RCIE=0;//发送前关闭接受中断使能位 TXREG = sendData; //把接收到的数据发送回去 while(!TXIF);//等待发送完成 RCIE = 1;//发送完成开启接收中断使能位 sendData=""; } } void Init(void) { TRISB=0B00000000;//控制8个LED,输出口 PORTB=0B00000000; 4000 // //初始化端口程序 TRISC7 = 1; //RX端口设为输入有效 TRISC6 = 0; //TX端口设为输出有效 //SPBRG = 0X19; //设置波特率为9600BPS SPBRG = 0XC; //设置波特率为19200BPS //TXSTA = 0x04; //异步通讯-禁止发送数据-高速模式 TXSTA = 0X24; //使能串口发送,选择高速波特率 //RCSTA = 0xA0; //串口使能-接收单字符-禁止连续接受 RCSTA = 0X90; //使能串口工作,连续接收 RCIE=0X1; //使能接收中断 GIE=0X1; //开放全局中断 PEIE=0X1; //使能外部中断 }
QT上位机源程序:
mainwindow.h
[code]#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> 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
[code]#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())//如果读到的数据不为空 { ui->textBrowser_RecList->insertPlainText(temp); } } //发送按钮槽函数 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码形式将数据写入串口 //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; //设置串口名 serial->setPortName(ui->comboBox_portList->currentText()); ui->textBrowser_RecList->insertPlainText("\nNowPort:"+ui->comboBox_portList->currentText()); //自动寻找可用串口的方法 //先关串口,再打开,可以保证串口不被其它函数占用。 //serial->close(); //打开串口 serial->open(QIODevice::ReadWrite); //设置波特率 serial->setBaudRate(ui->comboBox_BPS->currentText().toInt()); ui->comboBox_BPS->setDisabled(true); //设置数据位数 (8) serial->setDataBits(QSerialPort::Data8); //设置校验位(如0) serial->setParity(QSerialPort::NoParity); //设置停止位(如1) serial->setStopBits(QSerialPort::OneStop); //设置流控制(无) serial->setFlowControl(QSerialPort::NoFlowControl); //把串口的readyRead()信号绑定到read_Com()这个槽函数上 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(); //关串口 } } void MainWindow::on_pushButton_ClearRec_clicked() { ui->textBrowser_RecList->clear(); }
main.cpp
[code]#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
UI界面:
windows7 64位环境完整源码及源程序打包下载: https://download.csdn.net/download/robin_xx/10791050
相关文章推荐
- qt实现串口,UDP,TCP与嵌入式通信上位机软件
- 基于Vxworks实时操作系统的串口通信程序设计与实现
- 基于qt串口实现十六进制收发
- 基于fpga的串口通信实现
- Qt实现串口通信总结
- How:Java实现RS232串口通信
- 基于COMPAC协议的.NET框架实现的串口通信程序
- 基于双缓冲队列的串口通信模块的研究与实现
- 基于Android平台的串口通信实现
- 基于linux (fedora 17)的QT串口通信实例
- 基于QT的TCP协议实现的通信小程序
- 基于Android平台的串口通信实现
- 基于QT的TCP协议实现的通信小程序(另一种)
- 实现QT与Flex、Flash的通信(基于Socket)
- 基于Android平台的串口通信实现
- PIC单片机精通_串口通信模块C实现
- [原][osg][osgEarth]基于qt代码实现:TCP|UDP与飞行模拟软件JSBSim的通信,现实模型飞行!
- 基于QT的TCP协议实现的通信小程序
- Qt: 基于qextserialport实现的一个小串口工具
- 基于fpga的串口通信实现