用qt写的一个简单到不能在简单的上位机

学QT时,写的一个简单得不能再简单的串口上位机,用来控制单片机上的2个LED。假设一个是只有开和关的状态。一个可以调节亮度。上位机的界面如下图:

其中,波特率,数据位,停止位下拉值在设计师里面添加。剩下的功能,基本由代码实现。通信使用的协议也是随便写的。很简单和随意。图片是老弟手绘的。

下面贴代码 (*^__^*)

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtSerialPort>

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

    Pic = tr("://Resource/关灯.jpg"); //放置一张图片
    ui->lightLabel->setPixmap(Pic);

    ui->RTextEdit->setReadOnly(false);
    ui->STextEdit->setReadOnly(false);

    ui->onButton->setEnabled(true); //默认关灯
    ui->offButton->setEnabled(false);
    ui->lightDial->setEnabled(false);

    serial = new QSerialPort(this);
    OpenFlag = false;   //串口未打开

    connect(ui->lightDial, SIGNAL(valueChanged(int)), this, SLOT(on_light_chance()));

    UsartUi();
}

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

void MainWindow::UsartUi()  //完善串口配置UI
{
    ui->parityBox->addItem(QStringLiteral("None"),QSerialPort::NoParity);
    ui->parityBox->addItem(QStringLiteral("偶校验"),QSerialPort::EvenParity);
    ui->parityBox->addItem(QStringLiteral("奇校验"),QSerialPort::OddParity);
    ui->parityBox->addItem(QStringLiteral("Mark  1"),QSerialPort::MarkParity);
    ui->parityBox->addItem(QStringLiteral("Space 0"),QSerialPort::SpaceParity);

    ui->baundRateBox->setItemData(0,QSerialPort::Baud4800);
    ui->baundRateBox->setItemData(1,QSerialPort::Baud9600);
    ui->baundRateBox->setItemData(2,QSerialPort::Baud19200);
    ui->baundRateBox->setItemData(3,QSerialPort::Baud38400);
    ui->baundRateBox->setItemData(4,QSerialPort::Baud57600);
    ui->baundRateBox->setItemData(5,QSerialPort::Baud115200);

    ui->dataBitBox->setItemData(0,QSerialPort::Data5);
    ui->dataBitBox->setItemData(1,QSerialPort::Data6);
    ui->dataBitBox->setItemData(2,QSerialPort::Data7);
    ui->dataBitBox->setItemData(3,QSerialPort::Data8);

    ui->stopBitBox->setItemData(0,QSerialPort::OneStop);
    ui->stopBitBox->setItemData(1,QSerialPort::OneAndHalfStop);
    ui->stopBitBox->setItemData(2,QSerialPort::TwoStop);

    PortInfo();
}

void MainWindow::PortInfo()
{
    ui->uNameBox->clear();

    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        QStringList list;
        list << info.portName()
             << info.description()
             << info.manufacturer()
             << info.systemLocation()
             << (info.vendorIdentifier() ? QString::number(info.vendorIdentifier(), 16) : QString())
             << (info.productIdentifier() ? QString::number(info.productIdentifier(), 16) : QString());

        ui->uNameBox->addItem(list.first(), list);
    }
}

//槽函数
void MainWindow::on_startButton_clicked()   //打开串口
{
    if(!OpenFlag)//执行打开串口
    {

        currentConfig.name = ui->uNameBox->currentText();
        currentConfig.baudRate = static_cast<QSerialPort::BaudRate>
               (ui->baundRateBox->itemData(ui->baundRateBox->currentIndex()).toInt());
        currentConfig.dataBits = static_cast<QSerialPort::DataBits>
               (ui->dataBitBox->itemData(ui->dataBitBox->currentIndex()).toInt());
        currentConfig.stopBits = static_cast<QSerialPort::StopBits>
               (ui->stopBitBox->itemData(ui->stopBitBox->currentIndex()).toInt());
        currentConfig.parity = static_cast<QSerialPort::Parity>
               (ui->parityBox->itemData(ui->parityBox->currentIndex()).toInt());

        serial->setPortName(currentConfig.name);
        if(serial->open(QIODevice::ReadWrite))
        {
            if( serial->setBaudRate(currentConfig.baudRate)
                && serial->setDataBits(currentConfig.dataBits)
                && serial->setStopBits(currentConfig.stopBits)
                && serial->setParity(currentConfig.parity) )
            {
                OpenFlag = true;
                ui->startButton->setText(tr("关闭串口"));
            }
            else
            {
                serial->close();
                OpenFlag = false;
                ui->startButton->setText(tr("打开串口"));
            }
        }
        else
        {
            OpenFlag = false;
            ui->startButton->setText(tr("打开串口"));
        }

    }
    else
    {
        OpenFlag = false;
        ui->startButton->setText(tr("打开串口"));

        serial->close();
    }
/*    ui->STextEdit->setText(tr("校验位:%1 \n波特率:%2 \n数据位:%3 \n停止位:%4")
                             .arg(ui->parityBox->itemData(ui->parityBox->currentIndex()).toString())
                             .arg(ui->baundRateBox->itemData(ui->baundRateBox->currentIndex()).toString())
                             .arg(ui->dataBitBox->itemData(ui->dataBitBox->currentIndex()).toString())
                             .arg(ui->stopBitBox->itemData(ui->stopBitBox->currentIndex()).toString()));
*/
}

void MainWindow::on_offButton_clicked() //关灯
{
    QByteArray data;
    QString Pdata;
    data.resize(3);
    data[0] = 0xF0;
    data[1] = 0X0F;
    data[2] = 0x80;

    ui->offButton->setEnabled(false);
    ui->onButton->setEnabled(true);

    ui->lightDial->setValue(1);
    ui->lightDial->setEnabled(false);

    Pdata = data.toHex().toUpper();
    int Size = Pdata.size();
    for(int i = Size; i > 0; i--)
    {
        Pdata.insert(i * 2, " ");
    }

    ui->STextEdit->insertPlainText(Pdata);
    //发送数据
    serial->write(data);
}

void MainWindow::on_onButton_clicked()  //开灯  0XF0 0X0F 0X81
{

    QByteArray data;
    QString Pdata;
    data.resize(3);
    data[0] = 0xF0;
    data[1] = 0X0F;
    data[2] = 0X81;

    ui->onButton->setEnabled(false);
    ui->offButton->setEnabled(true);
    ui->lightDial->setEnabled(true);

    Pdata = data.toHex().toUpper();
    int Size = Pdata.size() / 2;
    for(int i = Size; i > 0; i--)
    {
        Pdata.insert(i * 2, " ");
    }

    ui->STextEdit->insertPlainText(Pdata);
    //发送数据
    serial->write(data);
}

void MainWindow::on_light_chance()
{
    QByteArray data;
    QString Pdata;
    data.resize(5);
    data[0] = 0xF0;
    data[1] = 0x0F;
    data[2] = 0xC0;
    data[3] = 0x01;
    data[4] = ui->lightDial->value();

    Pdata = data.toHex().toUpper();
    int Size = Pdata.size() / 2;
    for(int i = Size; i > 0; i--)
    {
        Pdata.insert(i * 2, " ");
    }
    ui->STextEdit->insertPlainText(Pdata);

    serial->write(data);
}

void MainWindow::on_freshButton_clicked()   //刷新状态
{
    QByteArray Rdata = serial->readAll();
    QString Pdata = Rdata.toHex().toUpper();    //转换成HEX格式且大写
    int Size = Pdata.size()/2;
    for(int i = Size; i > 0; i--)   //插入空格 使格式如 xx xx xx
    {
        Pdata.insert(i * 2, " ");
    }
    ui->RTextEdit->insertPlainText(Pdata);
    int i = 0;
    if(Rdata.at(i) && 0xF0 == 0xF0)
    {
        i++;
        if(Rdata.at(i) && 0x0F == 0x0F)
        {
            while(Rdata.at(i) != ‘\0‘) //解析指令
            {
                if(Rdata.at(i) && 0x80 == 0x80)currentStatus.lightOnOff = false;
                if(Rdata.at(i) && 0x81 == 0x81)currentStatus.lightOnOff = true;
                if(Rdata.at(i) && 0xc0 == 0xc0)
                {
                    i = i + 2;
                    currentStatus.lightValue = Rdata.at(i);
                }
                i++;
            }
        }
    }
    if(currentStatus.lightOnOff)Pic = tr("://Resource/开灯.jpg");
    else Pic = tr("://Resource/关灯.jpg");
    ui->lightLabel->setPixmap(Pic);
    ui->lightLcdNumber->display(currentStatus.lightValue);
}

  

用qt写的一个简单到不能在简单的上位机

时间: 2024-12-19 02:18:37

用qt写的一个简单到不能在简单的上位机的相关文章

C#做一个简单的进行串口通信的上位机

C#做一个简单的进行串口通信的上位机 1.上位机与下位机 上位机相当于一个软件系统,可以用于接收数据.控制数据.即可以对接收到的数据直接发送操控命令来操作数据.上位机可以接收下位机的信号.下位机是一个控制器,是直接控制设备获取设备状况的计算机.上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备.下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机.上位机不可以单独使用,而下位机可以单独使用. 2.串口通信 串口相当于硬件类型的接口.比如无线传感节

用Qt写的一个仿Windows记事本程序

闲得无聊加上自己喜欢Qt所以就写了这样一个仿windows记事本的程序,全部功能经测试可用.Qt版本5.5+win7x64 其中有部分逻辑比较乱,大家多多交流 备用链接:https://github.com/piaodonkey/notepad .pro部分: #------------------------------------------------- # # Project created by QtCreator 2015-09-12T21:33:50 # #------------

上位机简单串口类,VC串口类

我是在一家做硬件的的公司里面做软件开发工程师的,我做的软件大多是是编写软件通过串口去控制硬件,所以串口编程对于我来说是很重要的.串口编程之前一直使用的是自己写的简单串口(只有发送,没有接收)类,或者上网下的CSerialPort类(个人觉得不好用啊,互锁变量一堆,代码一开始还让人看不懂,对于上位机使用不合适).对于我做的上位机软件,其实使用串口只是需要顺序发送,接收数据无误就行了,不需要考虑太多东西.所以最近有点空,就自己再写了一个串口类(希望可以简单使用的,没有太高的要求的). (1)界面 界

用Qt写软件系列五:一个安全防护软件的制作(1)

引言 又有许久没有更新了.Qt,我心爱的Qt,为了找工作不得不抛弃一段时间,业余时间来学一学了.本来计划要写一系列关于Qt组件美化的博文,但是写了几篇之后就没坚持下去了.技术上倒是问题不大,主要是时间不够充裕.这段时间写几篇关于界面整体设计的博文,从最基础的界面元素开始,到最后构建一个页面元素丰富的桌面应用程序.Trojan Assessment Platform是一个原型设计项目,只是实现了有限的一部分功能.远远还称不上是一个评估平台.这里仅仅侧重于用Qt做界面的实现. 界面预览 首先还是看看

浮动布局写了一个简单的页面

正在学习的路上...... 这两天写了一个比较简单的页面,主要使用了浮动和定位.左边的属于滚动页面,右边的list属于固定.先上图片: 主要使用了float:left/right. 1.下面是HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <link type="

写一个ajax程序就是如此简单

写一个ajax程序就是如此简单 ajax介绍: 1:AJAX全称为Asynchronous JavaScript and XML(异步JavaScript和XML),指一种创建交互式网页应用的网页开发技术.     2:基于web标准XHTML+CSS的表示:     3:使用 DOM进行动态显示及交互:     4:使用 XML 和 XSLT 进行数据交换及相关操作:     5:使用 XMLHttpRequest 进行异步数据查询.检索: 程序员应用ajax的途经: 1:.Net下的Ajax

虚幻4,BP写了一个简单的三线跑酷工程

BP写了一个简单的三线跑酷 链接: http://pan.baidu.com/s/1jILE4V8 密码: 96ua

写了一个Java的简单缓存模型

缓存操作接口 /** * 缓存操作接口 * * @author xiudong * * @param <T> */ public interface Cache<T> { /** * 刷新缓存数据 * * @param key 缓存key * @param target 新数据 */ void refresh(String key, T target); /** * 获取缓存 * * @param key 缓存key * @return 缓存数据 */ T getCache(Str

java写的一个简单学生管理系统[改进]

用Java写的一个简单学生管理系统 import java.util.*; public class student_cj {  public static void main(String[] args){      Scanner in=new Scanner(System.in);   System.out.print("请输入学生人数:");   int num=in.nextInt();//学生人数   String[] str=new String[num];//结合一行数