QT 上位机(串口通信)

timer类

#ifndef MYTIMER_H
#define MYTIMER_H
#include <QTimer>
#include <qdatetime.h>

class MyTimer : public QTimer
{
public:
    MyTimer();
    QString gettimer();
    QString timetoString;
};
#endif
#include "mytimer.h"

MyTimer::MyTimer()
{

}

QString MyTimer::gettimer()
{
    QDateTime time = QDateTime::currentDateTime();
    timetoString = time.toString("yyyy-MM-dd hh:mm:ss");//yyyy-MM-dd hh:mm:ss dddd
    return timetoString;
//    qDebug() << QString(timetoString);
}

serial类

#ifndef SERIALPORT_H
#define SERIALPORT_H
#include "mytimer.h"
#include <QMainWindow>
#include <QDebug>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QTextCodec>

namespace Ui {
class SerialPort;
}

class SerialPort : public QMainWindow
{
    Q_OBJECT

public:
    explicit SerialPort(QWidget *parent = 0);
    ~SerialPort();

private:
    Ui::SerialPort *ui;
    QSerialPort *serial;//串口
    bool if_show_time = false;//是否显示时间
    bool if_auto_enter= false;//是否自动换行
    MyTimer mytimer;//时间



private slots:
    void on_clearButton_clicked();
    void on_clearsendButton_clicked();
    void on_sendButton_clicked();
    void on_openButton_clicked();
    void onTimeStateChanged(int state);//是否显示时间
    void onLineStateChanged(int state);//是否自动换行
    void Read_Data();
};
#endif // SERIALPORT_H
#include "serialport.h"
#include "ui_serialport.h"

SerialPort::SerialPort(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::SerialPort)
{
    ui->setupUi(this);

    connect(ui->timeCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onTimeStateChanged(int)));
    connect(ui->lineCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onLineStateChanged(int)));

    //查找可用的串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
            ui->serialBox->addItem(serial.portName());
            serial.close();
        }
    }
        //设置波特率下拉菜单默认显示第三项
        ui->bondBox->setCurrentIndex(3);
        //关闭发送按钮的使能
        ui->sendButton->setEnabled(false);
}

SerialPort::~SerialPort()
{
    delete ui;
}

//读取接收到的数据
void SerialPort::Read_Data()
{
    QByteArray recvQBA  = serial->readAll();
    QTextCodec *tc = QTextCodec::codecForName("GBK");
    QString recvQStr = tc->toUnicode(recvQBA);
    if(!recvQStr.isEmpty())
    {
        QString str = ui->receiveBrowser->toPlainText();
        str+=recvQStr;
        if(if_show_time)
        {
            str += "[";
            str += mytimer.gettimer();
            str += "]";
        }
        if(if_auto_enter)
        {
            str += "\r\n";
        }
        ui->receiveBrowser->clear();
        ui->receiveBrowser->append(str);

        //ui->receiveBrowser->append(recvQStr);
    }
    recvQBA.clear();
//    QByteArray buf;
//    buf = serial->readAll();
//    if(!buf.isEmpty())
//    {
//        QString str = ui->receiveBrowser->toPlainText();
//        str+=tr(buf);
//        ui->receiveBrowser->clear();
//        ui->receiveBrowser->append(str);
//    }
//    buf.clear();
}
void SerialPort::on_openButton_clicked()
{
    if(ui->openButton->text()==tr("打开串口"))
    {
        serial = new QSerialPort;
        //设置串口名
        serial->setPortName(ui->serialBox->currentText());
        //打开串口
        serial->open(QIODevice::ReadWrite);
        //设置波特率
        serial->setBaudRate(ui->bondBox->currentText().toInt());
        //设置数据位数
        switch(ui->dateBox->currentIndex())
        {
        case 8: serial->setDataBits(QSerialPort::Data8); break;
        default: break;
        }
        //设置奇偶校验
        switch(ui->oddevenBox->currentIndex())
        {
        case 0: serial->setParity(QSerialPort::NoParity); break;
        default: break;
        }
        //设置停止位
        switch(ui->stopBox->currentIndex())
        {
        case 1: serial->setStopBits(QSerialPort::OneStop); break;
        case 2: serial->setStopBits(QSerialPort::TwoStop); break;
        default: break;
        }
        //设置流控制
        serial->setFlowControl(QSerialPort::NoFlowControl);
        //关闭设置菜单使能
        ui->serialBox->setEnabled(false);
        ui->bondBox->setEnabled(false);
        ui->dateBox->setEnabled(false);
        ui->oddevenBox->setEnabled(false);
        ui->stopBox->setEnabled(false);
        ui->openButton->setText(tr("关闭串口"));
        ui->sendButton->setEnabled(true);
        //连接信号槽
        QObject::connect(serial, &QSerialPort::readyRead, this, &SerialPort::Read_Data);
    }
    else
    {
        //关闭串口
        serial->clear();
        serial->close();
        serial->deleteLater();
        //恢复设置使能
        ui->serialBox->setEnabled(true);
        ui->bondBox->setEnabled(true);
        ui->dateBox->setEnabled(true);
        ui->oddevenBox->setEnabled(true);
        ui->stopBox->setEnabled(true);
        ui->openButton->setText(tr("打开串口"));
        ui->sendButton->setEnabled(true);
    }
}


//清空接受窗口
void SerialPort::on_clearButton_clicked()
{
    ui->receiveBrowser->clear();
}

//发送数据
void SerialPort::on_sendButton_clicked()
{
    QString sendmesg = ui->sendEdit->toPlainText() + "\r\n";
    serial->write(sendmesg.toLatin1());
//    serial->write(ui->sendEdit->toPlainText().toLatin1());
}

void SerialPort::on_clearsendButton_clicked()
{
    ui->sendEdit->clear();
}

void SerialPort::onTimeStateChanged(int state)
{
    if (state == Qt::Checked) // "选中"
    {
        //qDebug() << tr("选中");
        if_show_time = true;
    }
    else if(state == Qt::PartiallyChecked) // "半选"
    {
        if_show_time = false;
    }
    else // 未选中 - Qt::Unchecked
    {
        if_show_time = false;
    }
}

void SerialPort::onLineStateChanged(int state)
{
    if (state == Qt::Checked) // "选中"
    {
        if_auto_enter = true;
    }
    else if(state == Qt::PartiallyChecked) // "半选"
    {
        if_auto_enter = false;
    }
    else // 未选中 - Qt::Unchecked
    {
        if_auto_enter = false;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值