帮朋友写个简单的Qt上位程序,串口通信,传输ASCII码,先要求打开一个TXT文件收到下位的"/"开始把TXT文件中的内容发送到下位,遇到TXT文件中的";"停止发送,下次发送
的时候继续发送。
首先在pro文件中加上QT +=serialport 保存
ui如下:
下面是头文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void Read_Data();
void on_openserial_clicked();
void on_openfile_clicked();
private:
Ui::MainWindow *ui;
QSerialPort *serial;
};
#endif // MAINWINDOW_H
下面是cpp文件中的内容
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->BaudBox->addItem("9600");
ui->BaudBox->addItem("19200");
ui->BaudBox->addItem("38400");
ui->BaudBox->addItem("57600");
ui->BaudBox->addItem("115200");
ui->BitNumBox->addItem("5");
ui->BitNumBox->addItem("6");
ui->BitNumBox->addItem("7");
ui->BitNumBox->addItem("8");
ui->StopBox->addItem("1");
ui->ParityBox->addItem("0");
ui->openserial->setEnabled(false);
serial = new QSerialPort;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
QSerialPort serial1;
serial1.setPort(info);
if(serial1.open(QIODevice::ReadWrite))
{
ui->PortBox->addItem(serial1.portName());
serial1.close();
}
ui->BaudBox->setCurrentIndex(0);
ui->BitNumBox->setCurrentIndex(3);
qDebug()<"界面设置成功");
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_openserial_clicked()
{
if(ui->openserial->text()==tr("打开串口"))
{
serial->setPortName(ui->PortBox->currentText());
if(!serial->open(QIODevice::ReadWrite))
{
qDebug()<"打开失败");
}
serial->setBaudRate(ui->BaudBox->currentText().toInt());
switch(ui->BitNumBox->currentIndex())
{
case 0:serial->setDataBits(QSerialPort::Data5);break;
case 1:serial->setDataBits(QSerialPort::Data6);break;
case 2:serial->setDataBits(QSerialPort::Data7);break;
case 3:serial->setDataBits(QSerialPort::Data8);break;
default:break;
}
switch(ui->ParityBox->currentIndex())
{
case 0: serial->setParity(QSerialPort::NoParity); break;
default: break;
}
switch(ui->StopBox->currentIndex())
{
case 0: serial->setStopBits(QSerialPort::OneStop); break;
case 1: serial->setStopBits(QSerialPort::TwoStop); break;
default: break;
}
//设置流控制
serial->setFlowControl(QSerialPort::NoFlowControl);
ui->PortBox->setEnabled(false);
ui->BaudBox->setEnabled(false);
ui->BitNumBox->setEnabled(false);
ui->ParityBox->setEnabled(false);
ui->StopBox->setEnabled(false);
ui->openserial->setText(tr("关闭串口"));
QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data);
}
else
{
serial->clear();
serial->close();
ui->PortBox->setEnabled(true);
ui->BaudBox->setEnabled(true);
ui->BitNumBox->setEnabled(true);
ui->ParityBox->setEnabled(true);
ui->StopBox->setEnabled(true);
ui->openserial->setText(tr("打开串口"));
}
}
void MainWindow::Read_Data()
{
QByteArray buf;
buf = serial->readAll();
if(buf.contains("/"))
{
QString str1 = ui->StextEdit->toPlainText(); //1 1,7,8,9目的是将 QString 转为char*,因为write函数不接受QString作为参数
int a; //2
a=str1.indexOf(";"); //3
QString str2=str1.mid(0,a); //4 2,3,4,5,6是将第一个分号找出来将之前的内容传递给下位,并将剩余部
str1=str1.right(str1.length()-a-1); //5 分截取出来重新赋值给StextEdit部件显示
ui->StextEdit->setText(str1); //6
char* ch; //7
QByteArray ba = str2.toLatin1(); //8
ch=ba.data(); //9
serial->write(ch);
}
if(!buf.isEmpty())
{
QString str = ui->textEdit->toPlainText();
str+=tr(buf);
ui->textEdit->clear();
ui->textEdit->append(str);
}
buf.clear();
}
void MainWindow::on_openfile_clicked()
{
QString filename=QFileDialog::getOpenFileName(this,tr("Open File"),".",tr("Text files (*.txt)"));
if(!filename.isEmpty())
{
QFile file(filename);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QMessageBox::warning(this,tr("Read File"),tr("Can not open file:\n%1").arg(filename));
return;
}
QTextStream in(&file);
ui->StextEdit->setText(in.readAll());
file.close();
ui->openserial->setEnabled(true);
}
else
{
QMessageBox::warning(this,tr("filename"),tr("You did not select any file"));
}
}