简介:上位机通过RS232串口发送消息给下位机,下位机收到消息并做出2个动作:(1)将消息通过RS232串口返回给上位机;(2)LED灯变化。上位机收到消息后将内容显示在UI界面上。
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("
");
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("
NowPort:"+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界面: