网络与串口调试助手

目 录
第1章 绪论 1
1.1 项目背景 1
1.2 国内外研究现状 1
1.3 主要研究内容 2
1.4 论文组织结构 2
第2章 软件需求分析 3
2.1 可行性分析 3
2.1.1 经济可行性 3
2.1.2 技术可行性 3
2.1.3 运行可行性 3
2.2 需求概述 3
2.3 功能需求分析 6
2.3.1 设备模块 6
2.3.2 设备信息模块 8
2.3.3 发送数据模块 9
2.3.4 数据接收模块 12
2.3.5 系统设置模块 13
2.3.5 其他功能模块 14
2.4 非功能需求分析 21
2.4.1 性能需求分析 21
2.4.2 可靠性分析 21
2.5 本章小结 21
第3章 软件系统设计 21
3.1 总体设计 21
3.1.1 基本框架设计 21
3.1.2 功能结构设计 22
3.1.3 关键技术介绍 23
3.2 详细设计 24
3.2.1 设备模块 24
3.2.2 设备信息模块 26
3.2.3 发送数据模块 27
3.2.4 数据接收模块 30
3.2.5 系统设置模块 31
3.2.6 其他功能模块 32
3.3 本章小结 36
第4章 软件实现 36
4.1 整体界面 37
4.1.1 界面设计 37
4.1.2 软件架构设计 37
4.2 设备模块 38
4.2.1 MyObject类的设计 38
4.2.2 设备创建 40
4.2.3 设备删除 42
4.3 设备信息模块 44
4.4 发送数据模块 46
4.4.1 单次发送 46
4.4.2 定时发送 47
4.4.3 设置发送模式 48
4.5 数据接收模块 49
4.6 系统设置模块 49
4.7 其他功能模块 50
4.7.1 清空数据接收框 51
4.7.2 清空数据发送框 51
4.7.3 加载文件 51
4.7.4 导出数据 52
4.7.5 显示字节数与重置计数 52
4.7.6 功能详解 53
4.8 本章小结 54
第5章 软件测试 54
5.1 测试原则 54
5.2 测试环境 55
5.3 设备模块测试 55
5.3.1 创建设备 55
5.3.2 删除设备 56
5.4 设备信息模块测试 56
5.5 发送数据模块测试 57
5.5.1 单次发送功能测试 57
5.6.2 定时发送功能测试 58
5.6.3 设置发送模式功能测试 58
5.6 数据接收模块测试 60
5.7 系统设置模块 60
5.8 其他功能模块测试 61
5.8.1 清空数据接收框功能测试 61
5.8.2 清空数据发送框功能测试 62
5.8.3 加载文件功能测试 63
5.8.4 导出数据功能测试 63
5.8.5 显示字节数功能测试 64
5.8.6 计数清零功能测试 64
5.8.7 显示设备数功能测试 65
第6章 总结与展望 66
6.1 总结 66
6.2 展望 66
参考文献 67
致 谢 68
2.3 功能需求分析
需求分析是软件生命周期中一个非常重要的过程,它决定着整个软件项目的质量,也是整个软件项目的成败所在。要求软件各个功能都可正常使用,且界面美观。
2.3.1 设备模块
调试助手的设备模块主要是使用户进行创建和删除设备的操作。对于创建设备,用户可以选择创建TCP类型的客户端和服务器或者UDP类型的客户端和服务器。串口设备自动检测创建。对于删除设备,是对已创建的设备进行删除。创建设备的活动图如图2-2所示。
在这里插入图片描述

#include "common.h"
#include <QDebug>
common::common(QWidget *parent) : QTextEdit(parent)
{
    
    
    connect(this,&QTextEdit::cursorPositionChanged,this,&common::changePosSLOT);
}

QString common::getCurrTime()
{
    
    
    return QTime::currentTime().toString();
}

QByteArray common::hexStrToByteArray(const QString &str)
{
    
    
    /*qDebug()<<"hexStrToByteArray::str="<<str;
    QByteArray senddata;
    int hexdata, lowhexdata;
    int hexdatalen = 0;
    int len = str.length();
    senddata.resize(len / 2);
    char lstr, hstr;

    for (int i = 0; i < len;) {
        hstr = str.at(i).toLatin1();

        if (hstr == ' ') {
            i++;
            continue;
        }
        i++;
        if (i >= len) {
            break;
        }

        lstr = str.at(i).toLatin1();
        hexdata = convertHexChar(hstr);
        lowhexdata = convertHexChar(lstr);
        qDebug()<<"hexStrToByteArray::hexdata="<<str;
        qDebug()<<"hexStrToByteArray::lowhexdata="<<str;
        if ((hexdata == 16) || (lowhexdata == 16)) {
            break;
        } else {
            hexdata = hexdata * 16 + lowhexdata;
        }

        i++;
        qDebug()<<"hexStrToByteArray::data="<<(char)hexdata;
        senddata[hexdatalen] = (char)hexdata;
        hexdatalen++;
    }

    senddata.resize(hexdatalen);
    */
        bool ok;
        QByteArray ret;
        QString str1;
        QStringList sl;
        QString str2;
        qDebug()<<"str.length="<<str.length();
        for(int i=1;i<=str.length();i++)
        {
    
    
            qDebug()<<"i="<<i;
            str2.append(str.at(i-1));
            qDebug()<<"str2="<<str2;
            if(i%2==0)//每两个字符放一起
            {
    
    
                sl.append(str2);
                str2.clear();
            }
        }

        foreach (QString s, sl) {
    
    
            if(!s.isEmpty())
            {
    
    
                //byte类型的数字要&0xff再赋值给int类型,其本质原因就是想保持二进制补码的一致性。
                char c = s.toInt(&ok,16)&0xFF;//任何一个数&0xFF都是它本身,这里为了保持补码的一致性(由byte(8位)-》int(32位))
                char d= 10;
                qDebug()<<"d="<<d;
                if(ok){
    
    
                    ret.append(c);
                }else{
    
    
                    qDebug()<<"非法的16进制字符:"<<s;
                }
            }
        }
    return ret;
}

/*char common::convertHexChar(char ch)
{
    if ((ch >= '0') && (ch <= '9')) {
        return ch - 0x30;
    } else if ((ch >= 'A') && (ch <= 'F')) {
        return ch - 'A' + 10;
    }else {
        return (-1);
    }
}*/

//只能输入16进制数和回退符
void common::keyPressEvent(QKeyEvent *event)
{
    
    
    if(event->key()==Qt::Key_0||event->key()==Qt::Key_1||event->key()==Qt::Key_2||event->key()==Qt::Key_3||event->key()==Qt::Key_4||event->key()==Qt::Key_5||event->key()==Qt::Key_6||event->key()==Qt::Key_7||event->key()==Qt::Key_8||event->key()==Qt::Key_9||event->key()==Qt::Key_A||event->key()==Qt::Key_B||event->key()==Qt::Key_C||event->key()==Qt::Key_D||event->key()==Qt::Key_E||event->key()==Qt::Key_F)
    {
    
    
        QString str=this->toPlainText();//保存已经有的
        str.append(event->text().toUpper());//添加新传来的
        this->clear();
        this->append(str);
    }
    else if(event->key()==Qt::Key_Backspace) {
    
    
        QString str=this->toPlainText();
        QString str1=str.remove(str.length()-1,1);
        this->clear();
        this->append(str1);
    }
}

//限制中文输入
void common::changePosSLOT()
{
    
    
    QString str=this->toPlainText();
    if(str=="")
        return;
    QString ch=str.at(str.length()-1);
    QChar ch1=str.at(str.length()-1);
    char ch2=ch1.toLatin1();
    qDebug()<<"str="<<str<<"  ch="<<ch;
    if((ch2>='A')&&(ch2<='F'))
    {
    
    
        //ch正常AF";
    }
    else if ((ch2>='0')&&(ch2<='9')) {
    
    
        //正常09";
    }
    else {
    
    
        //ch错误";
        if(!isFile)
        {
    
    
            str.remove(str.length()-1,1);
            this->clear();
            this->append(str);
        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/newlw/article/details/133064664