您的位置:首页 > 编程语言 > Qt开发

基于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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: