QT 串口发送接收(带发送缓冲区)

2023-11-17

QT 串口发送接收(带发送缓冲区)

串口代码更改,这里记录一下。接收因为是类似于中断的方式,接收一次处理一次,就没做接收缓冲区。与主板通讯模式为主从模式,串口发送函数用时钟轮询该函数。


变量定义

unsigned char serial_main::Send_Buf[30000][300];//发送缓冲区
unsigned char serial_main::recv_buf[150];//查询接收数据数组

串口初始化

/*********通讯串口初始化*******/
void serial_main::serial_port_init()
{
    qDebug()<<"serial port init.";
    serial_port_1 = new QSerialPort(this);
   //open_serial(m_com4,"/dev/ttyS1");
    open_serial(serial_port_1,"/dev/ttySAC1");
}

打开串口

/********打开串口***********/
void serial_main::open_serial(QSerialPort *serial, QString name)
{
    qDebug()<<"serial port open.";
    serial->setPortName(name);
    serial->setBaudRate(QSerialPort::Baud115200);//设置波特率和读写方向
//    serial->setBaudRate(QSerialPort::Baud57600);//设置波特率和读写方向
    serial->setDataBits(QSerialPort::Data8);		//数据位为8位
    serial->setParity(QSerialPort::EvenParity);	//偶验位
    serial->setFlowControl(QSerialPort::NoFlowControl);//无流控制
    serial->setStopBits(QSerialPort::OneStop); //一位停止位
    if(serial->open(QIODevice::ReadWrite))
    {
        //连接串口接收
        connect(serial, &QSerialPort::readyRead,this,&serial_main::receiveData);
        //连接接收分析函数
        connect(this,SIGNAL(receiveData_analysis_switch_1(QByteArray ,QString )),receive_data_main,SLOT(receiveData_analysis_switch_1(QByteArray ,QString )));
        qDebug()<<"open com" << name << "success!";
        //发送缓冲区初始化
        connect(this,SIGNAL(txd_rxd_data_init()),send_data_main,SLOT(txd_rxd_data_init()));
        emit txd_rxd_data_init();//初始化发送数据缓冲区,发送功能号0x02数据读取主板数据

        qDebug()<<"txd rxd data success!";
        return ;
    }
    else
    {
        qDebug()<<"open com" << name << "failed!";
    }
}

串口发送函数

/*******串口发送函数*********/
void serial_main::sendDate()
{
//    if(Send_fail==0)
//    {
        QByteArray data,temp;
        if(serial_main::Send_Buf[0][0]==0x00)//查询
        {
            unsigned char temp_query_buf[15];
            unsigned int chk = 0;
            temp_query_buf[0] = 0x33;//头
            temp_query_buf[1] = 0x43;//主板编号
            temp_query_buf[2] = 0x0f;//帧长度
            temp_query_buf[3] = 0xff;//随机生成唯一标识符高位
            temp_query_buf[4] = 0xff;//随机生成唯一标识符低位
            temp_query_buf[5] = 0x2c;//功能号
            temp_query_buf[6] = 0x00;//数据地址高位
            temp_query_buf[7] = 0x00;//数据地址低位
            temp_query_buf[8] = 0x00;//数据包序号,0表示没有分包
            temp_query_buf[9] = 0x00;//总数据分成了多少个包,0表示没有分包
            temp_query_buf[10] = 0x01;//当前数据包数据长度

            temp_query_buf[11] = 0x01;//数据内容

            for(int i=0; i <12; ++i)chk = (serial_main::crc16_tab[((chk>>8) ^ temp_query_buf[i]) & 0xFF] ^ (chk << 8));
            temp_query_buf[12] = (chk >> 8);//CRC校验高位
            temp_query_buf[13] = (chk );//CRC校验低位
            temp_query_buf[14] = 0x0d;//尾巴

            for(int i=0;i<15;i++)
            {
                data.clear();
                data.append(temp_query_buf[i]);
                serial_port_1->write(data);
            }

        }
        else
        {
            trans_size = Send_Buf[0][2];
            for(int i=0;i<trans_size;i++)
            {
                data.clear();
                data.append(serial_main::Send_Buf[0][i]);
                temp.append(QString::number(serial_main::Send_Buf[0][i], 16));
                temp.append("-");
                serial_port_1->write(data);
            }
//            qDebug()<<temp<<trans_size;
//            emit ButtonCommunicationDisplay_Send("SendDate:"+temp+" "+"size:"+QString::number(trans_size));
        }

//        /***************************************************************************/
//    //    qDebug()<<"TimeoutCount"<<TimeoutCount;
//        if(serial_main::TimeoutCount>=50000)
//            emit DictionaryQueryComplete(tr("通讯异常,请检查线路或程序是否匹配!"));
//        else
//            serial_main::TimeoutCount++;
//        /***************************************************************************/
//    }
}

发送缓冲区插入

/***********发送缓冲区插入main函数***********/
void serial_send_data::txd_All(int FuntionNumber,unsigned int address,int DateNumber,int DateLength_All,QString txd_date)
{
    switch(FuntionNumber)
    {
        case 0x66://停止命令
        {
            //遍历缓存区,原始数据下移,此数据插入第一行
            txd_All_0x66(FuntionNumber,address,DateNumber,DateLength_All,txd_date);
            break;
        }
//        case 0x16://手动的伺服动作
//        {
//            //清空缓冲区,此数据插入第一行
//            txd_All_0x16(FuntionNumber,address,DateNumber,DateLength_All,txd_date);
//            break;
//        }
        default:
        {
            //插入缓存区末尾
            txd_All_default(FuntionNumber,address,DateNumber,DateLength_All,txd_date);
            break;
        }
    }

//    QString temp_SendBug;
//    for(int i=0;i<tail_pointer+1;i++)
//    {
//        for(int j=0;j<trans_size;j++)
//        {
//            QByteArray temp;
//            temp.append(Send_Buf[i][j]);
//            temp_SendBug += temp.toHex();
//            temp_SendBug += "-";
//        }
//        qDebug()<<"Send_Buf:"<<temp_SendBug;
//        temp_SendBug.clear();
//    }

    serial_main::long_set_flag = 1;

//    stopbz=1;
//    tx_count=0;
//    commandflag=1;
//    myreadstate.manualflag=2;
}
/*********停止命令 遍历缓存区,原始数据下移,此数据插入第一行**********/
void serial_send_data::txd_All_0x66(int FuntionNumber,unsigned int address,int DateNumber,int DateLength_All,QString txd_date)
{
    bool ok;
    int j=11;
    unsigned int chk=0;
    QByteArray Data_ByteArray;
    /*********************************************************************/
    int Tail_Pointer = 0;
    for(int i=0;i<30000;i++)
    {
        if(serial_main::Send_Buf[i][0]==0x00)
        {
            Tail_Pointer = i;
            break;
        }
    }
    for(int i=Tail_Pointer;i>0;i--)
    {
        for(int j=0;j<300;j++)
        {
            serial_main::Send_Buf[i][j] = serial_main::Send_Buf[i-1][j];
        }
    }
    /*********************************************************************/
    QTime randtime;
    randtime = QTime::currentTime();
    qsrand(randtime.msec()+randtime.second()*1000); //以当前时间ms为随机种子
    serial_main::Send_RandomNumber = qrand() % 6000;    //产生0~6000的随机整数

    serial_main::Send_Buf[0][0] = SYNC;//0x33
    serial_main::Send_Buf[0][1] = SM_ADDR;//0x43
    serial_main::Send_Buf[0][2] = (14+(txd_date.length()/2));//帧长度
    serial_main::Send_Buf[0][3] = (serial_main::Send_RandomNumber&0xff00)>>8;//以随机数生成唯一标识符
    serial_main::Send_Buf[0][4] = (serial_main::Send_RandomNumber&0x00ff);
    serial_main::Send_Buf[0][5] = FuntionNumber;//功能号,0~255
    serial_main::Send_Buf[0][6] = (address&0xff00)>>8;//数据地址
    serial_main::Send_Buf[0][7] = (address&0x00ff);
    serial_main::Send_Buf[0][8] = DateNumber;//数据包序号,0表示没有分包
    serial_main::Send_Buf[0][9] = DateLength_All;//总数据分成了多少个包,0表示没有分包
    serial_main::Send_Buf[0][10] = (txd_date.length()/2);//当前数据包数据长度

    for(int i=0;i<txd_date.length()/2;i++)
    {
        Data_ByteArray.clear();
        Data_ByteArray.append(txd_date.mid(2*i, 2));
        serial_main::Send_Buf[0][j] = Data_ByteArray.toInt(&ok, 16);//将字符串代表的16进制数转换成10进制
        j++;
    }
    /*********************************************************************/
    for(int i=0; i <j; ++i)
    chk = serial_main::crc16_tab[((chk>>8) ^ serial_main::Send_Buf[0][i]) & 0xFF] ^ (chk << 8);
    serial_main::Send_Buf[0][j] = (chk >> 8);
    serial_main::Send_Buf[0][j+1] = (chk );
    serial_main::Send_Buf[0][j+2]=FRAME_END;
//    sys_txd.combuf[3]=sys_txd.combuf[3]+2;
//    memcpy(ser_queue[XMIT_QUEUE].entry[temp].buf,sys_txd.combuf,j+2);
    serial_main::trans_size=j+3;
//    if (myreadstate.manualflag!=0)
//          txerrcount=200;
    /*********************************************************************/
}
/********手动的伺服动作 清空缓冲区,此数据插入第一行**********/
void serial_send_data::txd_All_0x16(int FuntionNumber,unsigned int address,int DateNumber,int DateLength_All,QString txd_date)
{
    bool ok;
    int j=11;
    unsigned int chk=0;
    QByteArray Data_ByteArray;
    /************************************************/
    for(int i=0;i<30000;i++)
    {
        for(int j = 0;j<300;j++)serial_main::Send_Buf[i][j] = 0x00;
    }
    /************************************************/
    QTime randtime;
    randtime = QTime::currentTime();
    qsrand(randtime.msec()+randtime.second()*1000); //以当前时间ms为随机种子
    serial_main::Send_RandomNumber = qrand() % 6000;    //产生0~6000的随机整数

    serial_main::Send_Buf[0][0] = SYNC;//0x33
    serial_main::Send_Buf[0][1] = SM_ADDR;//0x43
    serial_main::Send_Buf[0][2] = (14+(txd_date.length()/2));//帧长度
    serial_main::Send_Buf[0][3] = (serial_main::Send_RandomNumber&0xff00)>>8;//以随机数生成唯一标识符
    serial_main::Send_Buf[0][4] = (serial_main::Send_RandomNumber&0x00ff);
    serial_main::Send_Buf[0][5] = FuntionNumber;//功能号,0~255
    serial_main::Send_Buf[0][6] = (address&0xff00)>>8;//数据地址
    serial_main::Send_Buf[0][7] = (address&0x00ff);
    serial_main::Send_Buf[0][8] = DateNumber;//数据包序号,0表示没有分包
    serial_main::Send_Buf[0][9] = DateLength_All;//总数据分成了多少个包,0表示没有分包
    serial_main::Send_Buf[0][10] = (txd_date.length()/2);//当前数据包数据长度

    for(int i=0;i<txd_date.length()/2;i++)
    {
        Data_ByteArray.clear();
        Data_ByteArray.append(txd_date.mid(2*i, 2));
        serial_main::Send_Buf[0][j] = Data_ByteArray.toInt(&ok, 16);//将字符串代表的16进制数转换成10进制
        j++;
    }
    /*********************************************************************/
    for(int i=0; i <j; ++i)
    chk = serial_main::crc16_tab[((chk>>8) ^ serial_main::Send_Buf[0][i]) & 0xFF] ^ (chk << 8);
    serial_main::Send_Buf[0][j] = (chk >> 8);
    serial_main::Send_Buf[0][j+1] = (chk );
    serial_main::Send_Buf[0][j+2]=FRAME_END;
//    sys_txd.combuf[3]=sys_txd.combuf[3]+2;
//    memcpy(ser_queue[XMIT_QUEUE].entry[temp].buf,sys_txd.combuf,j+2);
    serial_main::trans_size=j+3;
//    if (myreadstate.manualflag!=0)
//          txerrcount=200;
    /*********************************************************************/
}
/*******插入缓冲区末尾***********/
void serial_send_data::txd_All_default(int FuntionNumber,unsigned int address,int DateNumber,int DateLength_All,QString txd_date)
{
    bool ok;
    int j=11;
    unsigned int chk=0;
    QByteArray Data_ByteArray;

    int tail_pointer = 0;
    for(int i=0;i<30000;i++)
    {
        if(serial_main::Send_Buf[i][0]==0x00)
        {
            tail_pointer = i;
            break;
        }
    }

    serial_main::Send_RandomNumber = qrand() % 6000;    //产生0~6000的随机整数

    serial_main::Send_Buf[tail_pointer][0] = SYNC;//0x33
    serial_main::Send_Buf[tail_pointer][1] = SM_ADDR;//0x43
    serial_main::Send_Buf[tail_pointer][2] = (14+(txd_date.length()/2));//帧长度
    serial_main::Send_Buf[tail_pointer][3] = (serial_main::Send_RandomNumber&0xff00)>>8;//以随机数生成唯一标识符
    serial_main::Send_Buf[tail_pointer][4] = (serial_main::Send_RandomNumber&0x00ff);
    serial_main::Send_Buf[tail_pointer][5] = FuntionNumber;//功能号,0~255
    serial_main::Send_Buf[tail_pointer][6] = (address&0xff00)>>8;//数据地址
    serial_main::Send_Buf[tail_pointer][7] = (address&0x00ff);
    serial_main::Send_Buf[tail_pointer][8] = DateNumber;//数据包序号,0表示没有分包
    serial_main::Send_Buf[tail_pointer][9] = DateLength_All;//总数据分成了多少个包,0表示没有分包
    serial_main::Send_Buf[tail_pointer][10] = (txd_date.length()/2);//当前数据包数据长度


    for(int i=0;i<txd_date.length()/2;i++)
    {
        Data_ByteArray.clear();
        Data_ByteArray.append(txd_date.mid(2*i, 2));
        serial_main::Send_Buf[tail_pointer][j] = Data_ByteArray.toInt(&ok, 16);//将字符串代表的16进制数转换成10进制
        j++;
    }
    /*********************************************************************/
    for(int i=0; i <j; ++i)
    chk = serial_main::crc16_tab[((chk>>8) ^ serial_main::Send_Buf[tail_pointer][i]) & 0xFF] ^ (chk << 8);
    serial_main::Send_Buf[tail_pointer][j] = (chk >> 8);
    serial_main::Send_Buf[tail_pointer][j+1] = (chk );
    serial_main::Send_Buf[tail_pointer][j+2]=FRAME_END;
    //    sys_txd.combuf[3]=sys_txd.combuf[3]+2;
    //    memcpy(ser_queue[XMIT_QUEUE].entry[temp].buf,sys_txd.combuf,j+2);
    serial_main::trans_size=j+3;
//    if (myreadstate.manualflag!=0)
//          txerrcount=200;
    /*********************************************************************/
}

使用例子

QString temp_string = NULL;
            int temp_int = ui->speed_lineedit->text().toInt();
            int temp_position_plus = (ui->position_plus_lineedit->text().toFloat())*100;
            int temp_position_re = (ui->position_reduce_lineedit->text().toFloat())*100;

            temp_string += "70";//按钮命令值
            temp_string += "00";//轴选择命令值
            temp_string += serial_send_data_1->txd_All_QStringAnalysis(temp_int);//速度
            temp_string += serial_send_data_1->txd_All_QStringAnalysis(((temp_position_plus&0xff0000)>>16));//位置+高位
            temp_string += serial_send_data_1->txd_All_QStringAnalysis((temp_position_plus&0xff00)>>8);//位置+中位
            temp_string += serial_send_data_1->txd_All_QStringAnalysis(temp_position_plus&0x00ff);//位置+低位
            temp_string += serial_send_data_1->txd_All_QStringAnalysis(((temp_position_re&0xff0000)>>16));//位置-高位
            temp_string += serial_send_data_1->txd_All_QStringAnalysis((temp_position_re&0xff00)>>8);//位置-中位
            temp_string += serial_send_data_1->txd_All_QStringAnalysis(temp_position_re&0x00ff);//位置-低位
            serial_send_data_1->txd_All(0x03,0x0070,0x00,0x00,temp_string);
QString serial_send_data::txd_All_QStringAnalysis(unsigned char analysis_string)
{
    serial_main::long_set_flag = 1;
    QString temp = NULL;
    if(QString::number(analysis_string,16).length()==1)
    {
        temp = "0"+QString::number(analysis_string,16);
    }
    else
    {
        temp = QString::number(analysis_string,16);
    }
    return temp;
}

总结

有些功能还没做完,这里记录一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT 串口发送接收(带发送缓冲区) 的相关文章

  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • C++ 最长回文串

    已知一个只包括大小写字符的字符串 求用该字符串中的字符可以生成的最长回文字符串的长度 例如 s abccccddaa 可生成的最长回文字符串长度为9 如dccaaaccd adccbccda acdcacdca等 都是正确的 利用字符哈希方
  • 合肥工业大学密码学课设-RSA

    作者简介 CSDN内容合伙人 信息安全专业在校大学生 系列专栏 课设 密码学课设 RSA 新人博主 欢迎点赞收藏关注 会回访 舞台再大 你不上台 永远是个观众 平台再好 你不参与 永远是局外人 能力再大 你不行动 只能看别人成功 没有人会关
  • windows操作系统基础总结

    文章目录 引言 一 文件目录管理 二 网络配置 三 用户和群组 四 进程 五 核心文件 六 日志审核 七 登录日志 八 恶意行为跟踪 九 日志分析工具 引言 对windows下常见的dos命令进行总结 以及windows操作系统基础知识进行
  • Linux Centos7 测试硬盘IO速度

    1 测试磁盘写速度 time dd if dev zero of test dd bs 1M count 2000 2 测试磁盘读速度 time dd if test dd of dev null bs 1M
  • 云计算:优势与未来趋势

    文章目录 前言 一 云计算的优势 1 降低IT成本 2 提高工作效率 3 提高业务的可靠性和稳定性 4 提升安全性 二 未来发展趋势 1 AI与云计算的融合 2 边缘计算的发展 3 多云的趋势 4 服务器和存储的创新 三 行业应用案例 1
  • spring ioc流程

    spring 大体流程 spring的核心是ioc 所有的操作都是基于ioc来完成的 ioc是一个容器 为了解决类跟类之间的耦合问题 就是说 有一个A类 有一个B类 public class A B b new B public class
  • 理解图像卷积操作的意义

    数字信号处理中卷积 卷积一词最开始出现在信号与线性系统中 信号与线性系统中讨论的就是信号经过一个线性系统以后发生的变化 由于现实情况中常常是一个信号前一时刻的输出影响着这一时刻的输出 所在一般利用系统的单位响应与系统的输入求卷积 以求得系统
  • STM32MP153 Ubuntu系统移植到ST的STM32MP157-DK2记录

    米尔科技STM32MP153 Ubuntu系统移植到ST的STM32MP157 DK2记录 ubuntu18 ros系统 边缘计算 先上最终效果 核心思想 1 解包 挂载 先把米尔科技提供的ubuntu文件系统解包 然后挂载到一个文件夹mn
  • mybatis与mysql的Json格式映射-使用JSONObject

    mybatis与mysql的Json格式映射 使用JSONObject codestn 程序方块 mybatis与mysql的Json格式映射 使用JSONObject JavaBean类 1 2 3 4 5 6 7 public clas
  • 江西南昌电气机械三维测量仪机械零件3d扫描-CASAIM中科广电

    精密机械零部件是指机械设备中起到特定功能的零件 其制造精度要求非常高 这些零部件通常由金属 塑料或陶瓷等材料制成 常见的精密机械零部件包括齿轮 轴承 螺丝 活塞 阀门等 精密机械零部件的制造需要高精度的加工设备和工艺 以确保其尺寸 形状和表
  • wps指定路径不存在怎么办_WPS说目录不存在

    网友提问 安装wps之后 将其打开报错文件 打开的时候提示wps目录不存在的现象 并且将其卸载也是于事无补 那wps临时目录不存在提示无法卸载是怎么回事 下面就来看看wps临时目录不存在提示该如何解决 故障解决 一 wps应用程序本身的故障
  • Python pathlib库路径,使用sorted(中文、字母和数字混合名称)定义排序,解决1位数、2位数、3位数的数字排序问题

    Path rgolb 当路径指向一个目录时 列出该路径下所有子路径 默认升序排列 输出为 使用sorted和lambda定义排序 中文 字母和数字混合名称的排序 输出
  • SpringCloud简介及使用

    SpringCloud简介 Spring cloud是一个基于Spring Boot实现的服务治理工具包 在微服务架构中用于管理和协调服务的 微服务 就是把一个单体项目 拆分为多个微服务 每个微服务可以独立技术选型 独立开发 独立部署 独立
  • Ego小程序测试

    Ego小程序测试 一 前置知识 1 小程序MiniProgram 2 小程序和App区别 3 小程序和App联系 4 微信开发者工具 5 技术架构 二 Ego商城介绍 三 测试流程 四 Ego商城项目部署 1 注册微信小程序账号 2 后端部
  • 数据分析之面试题目汇总(万字解读)

    1 解释数据清洗的过程及常见的清洗方法 数据清洗是指在数据分析过程中对数据进行检查 处理和纠正的过程 是数据预处理的一步 用于处理数据集中的无效 错误 缺失或冗余数据 常见的清洗方法包括 处理缺失值 处理异常值 去除重复值 统一数据格式等
  • 2_C/S模型编程示例1

    本文主要参考C语言中文网和linux网络编程 网络基础 socket编程 高并发服务器 1 网络程序设计模式 1 1 CS模式 客户机 client 服务器 server 模式 需要在通讯两端各自部署客户机和服务器来完成数据通信 1 本地可
  • Docker 安装 FastDFS

    FastDFS 是一个开源的分布式文件系统 对文件进行管理 功能包括 文件存储 文件同步 文件访问 文件上传 文件下载 等 解决了大容量存储和负载均衡的问题 特别适合以文件为载体的在线服务 如相册网站 视频网站等等 FastDFS 服务端有
  • 设计模式之惰性模式

    惰性模式 惰性模式并不是经典设计模式中的一种 可以把它看作一种拓展的设计模式 它的使用场景通常如下 当执行某段代码前有前置逻辑判断 但该前置逻辑判断在特定环境下不会发生改变时 只需要执行一次 如果已知前置的逻辑判断后 仍然每次执行方法都走一
  • VUE使用vue-print-nb实现打印功能,解决图片问题,样式问题

    vue做了一个打印功能 也遇到过一些问题 记录一下 有些问题欢迎大家批评指正 从网上找了一些打印方式最终决定用这种方式 安装 npm install vue print nb save 然后在main js中引入 import Print
  • QT 串口发送接收(带发送缓冲区)

    QT 串口发送接收 带发送缓冲区 串口代码更改 这里记录一下 接收因为是类似于中断的方式 接收一次处理一次 就没做接收缓冲区 与主板通讯模式为主从模式 串口发送函数用时钟轮询该函数 文章目录 QT 串口发送接收 带发送缓冲区 变量定义 串口