基于RS232串口实现PIC单片机下位机与QT上位机通信

发布者:HeavenlySunset最新更新时间:2020-01-23 来源: eefocus关键字:RS232串口  PIC单片机  下位机  QT  上位机通信 手机看文章 扫描二维码
随时随地手机看文章

简介:上位机通过RS232串口发送消息给下位机,下位机收到消息并做出2个动作:


(1)LED灯变化。


(2)将消息通过RS232串口返回给上位机;


上位机收到消息后将内容显示在UI界面上。


windows7 64位环境完整源码及源程序打包下载:   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;//清中断标志位

        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;//

 

    //初始化端口程序

    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


#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())//如果读到的数据不为空

     {

         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


#include "mainwindow.h"

#include

 

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

关键字:RS232串口  PIC单片机  下位机  QT  上位机通信 引用地址:基于RS232串口实现PIC单片机下位机与QT上位机通信

上一篇:PIC单片机入门笔记(新手学PIC必看)——基于PIC16F886
下一篇:PIC单片机的指针

推荐阅读最新更新时间:2024-11-12 02:52

使用MSP432+ESP8266+QT制作上位机进行WIFI通信
前言 在进行电子设计的过程中,常常会有需要进行WIFI传输的要求,我们使用ESP8266接收MSP432的串口数据,通过TCP/IP协议进行数据传输,利用QT编写上位机在手机端进行数据的显示可以完成项目的要求。 1.MSP432P401R数据的串口传输 MSP432P401R具有四个串口,我们使用串口3进行与ESP8266的数据传输,我们在主程序中编写串口的发送,注意MSP432串口的RX应与ESP8266的TX相连,MSP432串口的TX应与ESP8266的RX相连,同时两个模块需要共地连接,同时收发两端的波特率需要相同。 串口发送代码如下: USARTA3_SendString(SEND_APP);
[单片机]
使用MSP432+ESP8266+<font color='red'>QT</font>制作<font color='red'>上位机</font>进行WIFI<font color='red'>通信</font>
PIC单片机读写DS1302
#i nclude pic.h #define uchar unsigned char #define T_CLK RC3 #define T_IO RC4 #define T_RST RC5 unsigned char TDATA; int js; int Order ; bit sci_sign=0; int buf ; void Get1302(uchar *); void RTInputByte(uchar); uchar RTOutputByte(void) ; void W1302(uchar , uchar ); uchar R1302(uchar); void Set1302(uchar*); void sci
[单片机]
刚学PIC单片机,分享第一个电子时钟,定时器计时
#define _XTAL_FREQ 4000000 //晶振定义 #include pic.h //头文件包含 //__CONFIG(0x3b31);//芯片配置字定义 // CONFIG1 #pragma config FOSC = XT // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled
[单片机]
刚学<font color='red'>PIC单片机</font>,分享第一个电子时钟,定时器计时
pic单片机,链接描述文件(*.lkr)含义
结合18f4620.lkr来说明链接描述文件中代码的含义 // $Id: 18f4620.lkr,v 1.3 2004/04/26 18:09:00 curtiss Exp $ // File: 18f4620.lkr // Sample linker script for the PIC18F4620 processor //将当前目录library/object搜索路径,.代表当前目录 LIBPATH . //FILES伪指令指定链接的目标或库文件 //注:可以在一个单独的 FILES 伪指令中指定多个目标或库文件。 FILES c018i.o FILES clib.lib FILES p18f4620.l
[单片机]
PIC单片机应用专题三:I2C读写24C02
自从开始学习单片机起,就觉得I2C是个很有用的东西,它能大大节省我们的端口,现把软件模拟的I2C程序写出来,既是给大家分享,也是为自己做一下备份.下面的程序是用I2C存储24C02: INCLUDE P16F5X.INC ;同样可用于其他型号 ;*************************定义变量************************ STATUS EQU 3H PORTB EQU 6H PORTC EQU 7H EEPROM EQU 08H ADDR EQU 09H
[单片机]
基于PIC单片机的摩托车防盗器设计
R3EQU0X03PORT5EQU0X05PORT6EQU0X06R3EQU0X03KEY_STATUSEQU0X10;低半字节为按键标志,高半字节为控制标志SIGNAL_LOWEQU0X11;信号电平低计数器SIGNAL_HIGHEQU0X12;信号电平高计数器DATA_RECORDEREQU0X1 R3EQU0X03 PORT5EQU0X05 PORT6EQU0X06 R3EQU0X03 KEY_STATUSEQU0X10;低半字节为按键标志,高半字节为控制标志 SIGNAL_LOWEQU0X11;信号电平低计数器 SIGNAL_HIGHEQU0X12;信号电平高计数器 DATA_RECORDEREQU0X13;接收码数
[单片机]
基于<font color='red'>PIC单片机</font>的摩托车防盗器设计
PIC单片机之SPI总线篇
大家好,通过前一期的学习,我们已经对ICD2 仿真烧写器和增强型PIC 实验板的使用方法及学习方式有所了解与熟悉,现在我们就趁热打铁,再向上跨一步,一起来学习一下SPI 总线器的工作原理及使用方法,这样我们可以将一些需要保存的数据保存到存储器芯片中,掉电不会失丢,如汽车的里程表,它在不断地计数,其公里数就是放在一个SPI 总线的存储器芯片里面。 一、SPI总线基本概念 SPI ( Serial Peripheral Interface ———串行外设接口) 总线是Motorola 公司推出的一种同步串行接口技术。SPI 总线系统是一种同步串行外设接口, 允许MCU 与各种外围设备( 如闪存、数摸转换、网络控制器、从MCU)
[单片机]
<font color='red'>PIC单片机</font>之SPI总线篇
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved