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

2019-04-15 12:51发布

简介:上位机通过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界面: