STM32MP157实现串口接收数据上云-云数据库存储多设备数据&界面显示实现

2023-05-16

文章目录

  • 前言
  • 一.软件安装
  • 二.代码改进
    • 1.串口接收
    • 2.JSON数据解析
  • 三.云产品流转
    • 1.作用
    • 2.自定义产品功能&添加设备
    • 3.创建数据传输规则
  • 四.MYSQL操作
  • 五.NODE-RED操作
    • 1.总体思路
    • 2.安装节点
    • 3.节点配置
    • 4.页面布局
  • 六.源码(转载请注明出处)
  • 结语


前言

本篇分享:

前几篇博客分享了STM32MP157实现串口接收数据上云,实现了STM32MP157的串口在接收到数据时能上传至服务器,让用户可以随时随地查看一个设备的实时信息。

本篇要分享的是如何在之前的基础上更进一步,实现云数据库存储多设备数据以及界面显示


准备工作:

一.软件安装

整个过程的实现大体思路是:
数据–>STM32MP157–>云平台–>NODE-RED–>MYSQL

为了实现多设备数据存储云数据库并实现界面显示,这里需要在服务器安装两个必要的软件:MYSQL、NODE-RED用于实现数据存储和界面显示,并且推荐安装宝塔Linux面板和phpMyAdmin数据库可视化操作软件,这里四个软件都用到了,所以推荐都安装,网上有很多安装教程,这里就不赘述了。

  • 必要安装:MYSQL(存储数据)、NODE-RED(连接阿里云和数据库&界面显示)
  • 推荐安装:宝塔Linux面板(安装软件方便,可一键安装MYSQL和phpMyAdmin)、phpMyAdmin(云端数据库可视化操作)

安装完软件后记得在服务器的 安全组规则中添加需要使用的端口号

  • 路径:控制台-云服务器ECS-蓝色示例名称-配置安全组规则-配置规则-添加安全组规则
  • 操作:如宝塔面板的端口范围输入9696/9696、授权对象输入0.0.0.0/0即可;NODE-RED的端口号为1880
  • 另外,在宝塔面板的安全里面同样也要放行端口(两边都要)
  • 安装软件后输入ip+端口发现页面无法打开就检查下安全组规则有没有配置

改进工作:

二.代码改进

现在将串口接收的数据也规定为JSON格式(如:{“id”:“1”,“2_CurrentVoltage”:“90”}),并解析该数据,得到所需数据进行上传。

1.串口接收

​串口则要实现一次性接收PC端串口调试助手发送的全部数据,再去进行解析
​这时,原来写的串口接收代码就无法满足要求了,接收数据时会出现如下问题:

在这里插入图片描述
可以看到,每当串口接收到8位数据时FD_ISSET函数就能检测到设备为可读状态,而id和电压数据可能为一位数也可能为两位数,则不可能使用接收字符个数去判断,用接收次数判断的话后续添加数据时还需要计算发送的字符个数再对次数进行更改,以上两种方法均不太可取。

​这里使用的方法则是再增加一个串口接收线程保存接收的数据并且增加两个变量rece_byte_new和rece_byte_old,当接收到数据时rece_byte_new++。在主循环中则判断rece_byte_new>0时进入一个循环,等待数据接收完,在循环体内将rece_byte_new赋值给rece_byte_old,循环延时的时间设置为比串口接收8位数据稍大的时间(这个时间很重要,不能太大也不能太小,太小接收不完8位数据就去判断old和new是否相等会导致提前退出循环,太大会降低接收效率消耗不必要的时间,根据波特率115200计算,串口接收8位数据约为520us,这里设置为650us),这样无论数据多长这里都不需要进行更改,直到rece_byte_new和rece_byte_old相等时退出循环,继续执行后续的数据解析。代码如下:

/*相关头文件*/
#include <string.h>
#include <pthread.h>

/*全局变量*/
char rece_data[256];

/*创建进程*/
pthread_t id2;
pthread_create(&id2,NULL,serial_lsd2,&serportfd_PC);//创建线程

/*串口接收外部数据线程*/
void *serial_lsd2(void *d)//串口接收外部数据线程
{
    int tfd=*(int *)d;
    char rec_data[64];
    fd_set rd;
    
    while (1)
    {
        /*检查设备(文件描述符tfd)是否可读*/
        FD_ZERO(&rd);//清空rd
        FD_SET(tfd,&rd);//将tfd添加进rd中
        if(select(tfd+1,&rd,NULL,NULL,NULL)<0)//检查设备是否可读
            perror("select");

        /*如果tfd可读 执行select后rd中tfd仍为1 FD_ISSET(tfd,&rd)成立 则读取并打印数据*/
        if(FD_ISSET(tfd,&rd))//如果可读则读取并打印数据
        {
            rece_byte_new++;//持续时间为数据读取和保存的时间
            while(read(tfd,rec_data,1)>0)
            {
                strcat(rece_data,rec_data); 
            }  
        }
    }
}

/*主循环相应代码*/
/*检测到外部设备正在传输数据*/
if(rece_byte_new > 0)
{
    /*循环等待数据传输完毕*/
    while(rece_byte_new != rece_byte_old)
    {
        rece_byte_old = rece_byte_new;
        /*波特率115200下1字节传输时间约为520us 此处设置延时应比理论时间稍长*/
        usleep(650);
    }

    /*退出循环表示数据接收完毕 标志位清零等待下一次接收*/
    rece_byte_new = 0;
    rece_byte_old = 0;

    printf("Successfully received data!\n");//成功接收数据提示
    //后续代码-数据解析
}

2.JSON数据解析

​当接收到JSON格式的数据后该如何对数据进行解析,提取出AT指令(发送消息到云平台)所需的数据呢?

​这里我先是使用了cJSON第三方库进行解决,解决步骤就是将接收到的字符串转化成JSON对象,再调用cJSON_GetObjectItem对相应字段后的数据进行提取,提取后再用cJSON_Print函数将其转为字符串。但由于提取出的字符串自带引号,串口又不能直接发送引号,这里又需要用到sscanf函数对字符串进行提取,稍微有点麻烦……

​所以,我直接使用了sscanf函数对数据进行提取……

while(1)
{
    //代码-等待数据接收完成
    /*数据提取 约定数据传输的格式为JSON格式*/
    sscanf(rece_data,"{\"id\":\"%d\",\"%d_CurrentVoltage\":\"%d\"}",&int_id,&int_identifier,&int_CurrentVoltage);

    /*判断数据是否有误 再决定是否上传至云端*/
    send=1;
    if(int_id <= 0 || int_CurrentVoltage <= 0 || (int_id != int_identifier))//此处约定 int_id == int_identifier
    {   
        printf("data error\n");
        send=0;
    } 

    /*数据无误*/
    if(send==1)
    {
        /*生成AT指令*/
        sprintf(send_data,"AT+MPUB=\"/sys/a1cdS8zCRA0/863488054279453/thing/event/property/post\",1,0,\"{\\22id\\22:%d,\\22params\\22:{\\22%d_CurrentVoltage\\22:%d},\\22version\\22:\\221.0\\22,\\22method\\22:\\22thing.event.property.post\\22}\"\r",int_id,int_identifier,int_CurrentVoltage);
        /*向4G模块发送AT指令*/
        write(serportfd_4G,send_data,strlen(send_data));
    }
    memset(rece_data,0,sizeof(rece_data));//清空rece_data
}

转发工作:

三.云产品流转

1.作用

在设备接收到数据后,将该数据转发至NODE-RED

2.自定义产品功能&添加设备

​在上面代码中出现了%d_CurrentVoltage是因为我在阿里云对产品新增了两个功能,用于显示两台设备的数据,标识符分别为1_CurrentVoltage2_CurrentVoltage。另外,为了后续连接云数据库还需要增加一个NODE-RED设备用于MQTT通讯。

​添加产品功能和设备的方法之前讲过了,这里就简述下:

  • 添加自定义功能:产品-Air724(产品名)-功能定义-编辑草稿-添加自定义功能-发布上线。
  • 添加设备:设备-添加设备,产品选同类型即可,DeviceName 我这里设置为NODE-RED
    在这里插入图片描述

3.创建数据传输规则

​接着,需要进行数据传输规则的创建,在规则引型中找到云产品流转。

在这里插入图片描述
点击回到旧版,旧版使用较方便(新版还没用过:_)

在这里插入图片描述
点击创建规则数据格式选JSON,其他可以自己定义。

在这里插入图片描述
在这里插入图片描述
点击编写SQL,字段输入*(即转发接收到的所有数据),Topic选择物模型数据上报,设备选择接收板子上传数据的那个设备,再选择我们AT指令中发送的Topic:thing/event/propert/post,点击确认。

在这里插入图片描述
再点击添加操作。

在这里插入图片描述
操作选择发布到另一个Topic,Topic选择NODE-RED的user/get,点击确认。

在这里插入图片描述
返回到云产品流转界面,点击启动即可。

在这里插入图片描述
存储工作:

四.MYSQL操作

这里讲一下MYSQL可视化的操作(终端操作直接调到下方根据表结构建表即可),安装完宝塔面板后,在软件商店中安装MYSQLphpMyAdmin
在这里插入图片描述
安装完后,在数据库中找到phpMyAdmin,点击通过面板访问。

在这里插入图片描述
登录需要输入MYSQL的用户名和密码,安装完的MYSQL有默认用户名和密码,网上有查询教程。之前安装过的,就输入数据库登录的用户名和密码即可。

​点击新建一个数据库。

在这里插入图片描述
新建两个数据表存储不同设备数据(一张表存储一个设备数据,多个设备就建多张表)。

在这里插入图片描述
输入字段名,可以添加一个id的字段让其自增作为主键,这样后续就可以对数据表进行删除和编辑等操作。

在这里插入图片描述创建完成后继续在左边选择新建数据表,再新建一个表device_2,结构和上表相同即可。

在这里插入图片描述
连接&显示工作:

五.NODE-RED操作

1.总体思路

NODE-RED这边的总体思路就是接收云平台发送的数据,将数据发送至函数处理,在函数节点将数据进行提取处理成SQL语句后发送至MQSQL节点实现数据的存储;另外用switch节点(功能类似c语言中的switch),根据id去决定更新界面中的设备1电压表还是设备2电压表数据。

2.安装节点

​安装好NODE-RED后输入服务器ip:1880打开NODE-RED,可以看到左边为NODE-RED节点栏,这里可以找到需要的节点并直接拖出到中间即可配置使用(中文设置在右上角三条横杠的设置中)。

​这里需要用到的MYSQL节点dashboard节点原本都没有,需要自行下载。点击右上角三条横杆-节点管理-安装,搜索node-red-dashboardnode-red-node-mysql安装即可,想用table的节点的话需要另外安装node-red-node-ui-table(之前一直奇怪为什么我的dashboard没有table这个节点)

在这里插入图片描述

3.节点配置

  • mqtt in节点

    mqtt in节点的作用是实现NRED-RED与云平台的MQTT通讯。在节点栏里找到网络下面的mqtt in节点并拖出,双击节点,点击服务端后面的编辑图标。

    在这里插入图片描述
    点开后,需要配置的有连接中的服务端和客户端ID安全中的用户名和密码,如何获取这些参数可以看下之前4G设备向云发送数据中的2.连接阿里云操作,名称自定义即可,设置好后返回上图这个界面再将主题补充完整(填云产品流转的转发数据中设置的那个Topic)。配置完后点击完成,再点击NODE-RED右上角的部署,部署完后看到mqtt in节点下方出现已连接即为成功

  • mysql节点

    mysql节点的作用是,实现NODE-RED与MYSQL的连接。安装完MYSQL节点后,在左侧节点栏存储中找到mysql节点并拖出,双击mysql节点,点击编辑,配置MYSQL的Host(MYSQL和NODE-RED安装在同一服务器下输入服务器ip或127.0.0.1均可)、端口号(MYSQL默认端口号)、登录用户名密码以及要连接的数据库名称配置好后点击部署,部署完后mysql节点下方出现connected即为成功

    在这里插入图片描述

  • function节点

    function节点的作用主要是对数据的处理。在左侧节点栏功能中找到function节点并拖出,双击function节点,可以在函数的文本编辑框中用JS语言编写代码,这部分代码主要要实现的功能是对从阿里云发送的数据进行提取,再组合成一条SQL语句,再发送至MYSQL数据库进行执行,从而达到数据存储的目的。

    在这里插入图片描述

具体代码如下所示:

/*定义插入数据SQL语句*/
var find = "INSERT INTO `db_devices2`.`device_%s` (`CurrentVoltage`) VALUES ('%s')"

/*根据设备补充SQL语句*/
if (msg.payload.requestId == 1)//如果设备id为1
{
    var newMsg = {
        // @ts-ignore
        "topic": util.format(find, msg.payload.requestId, msg.payload.items["1_CurrentVoltage"].value )//用format函数将接收到的数据对SQL语句进行补充(如果对JSON不熟悉,可以用debug得到数据所在路径,下面在debug节点中介绍)
    }
}
else if (msg.payload.requestId == 2)//如果设备id为2
{
    var newMsg = {
        // @ts-ignore
        "topic": util.format(find, msg.payload.requestId, msg.payload.items["2_CurrentVoltage"].value )
    }
}

/*赋值并返回*/
msg.topic = newMsg.topic
return msg;

代码解析:

这段代码是在 Node-RED 环境中,使用 JavaScript 编写的代码。它用于构造消息对象,并通过修改消息对象的 topic 属性来更新消息。

这段代码中的 "msg" 是消息对象,是一种在节点间传递信息的方式。在这段代码中,消息对象携带了 payload 属性,该属性是一个包含请求 ID 和其他数据项的对象。代码通过判断请求 ID 的值是 1 还是 2,来选择需要获取的数据项。然后它创建一个新的消息对象 "newMsg",并在该对象中指定了该消息的主题。最后,原始消息对象的主题属性被重新设置为 "newMsg" 的主题,并返回该消息对象。

这段代码中的 util.format 方法是 Node.js 中的格式化工具,用于构造新的消息主题。该方法的第一个参数是一个字符串,它包含了两个占位符,用于表示请求 ID 和数据项的值。第二个参数是请求 ID 的值,第三个参数是数据项的值。最终,消息的主题将是一个插入语句,用于将数据项的值插入到数据库中。

具体来说:
定义了一个字符串变量 find,表示要执行的 SQL 语句;该SQL语句将通过 "msg" 消息对象在节点间传递(传递给数据库节点时,就能根据消息对象携带的SQL语句执行相应的操作)。
判断 msg.payload.requestId 的值,如果为 1,则创建一个名为 newMsg 的对象,并赋予其 topic 属性;
同理,如果 msg.payload.requestId 的值为 2,则创建一个名为 newMsg 的对象,并赋予其 topic 属性;
最后,将 msg 的 topic 属性更新为 newMsg 的 topic 属性,并返回 msg 对象,传递给下一节点。
util.format() 函数功能类似 sprintf 函数

// @ts-ignore 是 TypeScript 的注释,表示忽略类型检查。
  • debug节点

    debug节点在左侧节点栏的共通中,其作用是接收前面节点输出的数据并在调试窗口进行显示

    在完成mqtt in、function、mysql三个节点的配置后,可以在mqtt in以及function节点后连接一个debug节点,方便用户查看接收的数据是否准确。

    这里连接好点击部署,并运行开发板程序向云平台发送数据,测试数据是否可以正常插入数据库。

    在这里插入图片描述
    可以看到在数据发送成功后,NODE-RED右侧的调试窗口打印出了相关信息,这些就是NODE-RED接收到云平台转发的数据。

    在这里插入图片描述
    这时候,可以看到debug3正确打印了SQL语句,查看MYSQL数据库,发现数据已成功存储。

    在这里插入图片描述
    在function函数内不知该如何写数据路径时,可以使用debug得到,比如需要value的路径,方式如下图所示。

    复制得到的结果为payload.items[“1_CurrentVoltage”].value,然后在payload前加上msg.即可。gauge节点中还有相关图片描述!

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

  • switch节点

    switch节点在左侧节点栏的功能中,作用类似于c语言当中的switch-case,配置方法就是在属性处输入想要判断的变量,在下方输入具体的值即可。

      ![在这里插入图片描述](https://img-blog.csdnimg.cn/bcf2a6f2416a41b3b379fdeac429313b.png#pic_center)
    

    每增加一个项switch节点后都会多出一个数据输出口,将光标放在上面可以看到该输出口具体信息。

    在这里插入图片描述

  • gauge节点

    gauge节点在左侧节点栏的dashboard中,部署后可以在ui界面显示一个表盘,将想要展示的数据以表盘形式展示
    同样的,路径在右侧复制后前面加上msg.,粘贴至Value format处并在两端加上两个大括号(如下图)。
    Units处输入想要的单位即可。
    Label即为该表盘的名称。
    Group点击旁边的编辑按钮,NameTab自定义即可。

    在这里插入图片描述
    配置完成后点击部署,在浏览器中新建一个标签页,在网址栏中输入ip:1880/ui即可访问NODE-RED的ui界面,设备1的数据为刚刚上传的电压数据。

    在这里插入图片描述

4.页面布局

​页面的自动布局默认为“Z”字型布局,当横着放不下两个表的时候,会自动移动至下行的行首。
如果不想让其自动布局,可以点击这个layout进行布局

在这里插入图片描述
Width处可以更改页面宽度,将gauge上锁后表盘的位置可以自行拖动调节,布局成自己想要的效果。

在这里插入图片描述
Theme中也可以对页面风格进行调节,将页面调成自己想要的风格。

在这里插入图片描述


六.源码(转载请注明出处)

在这里插入图片描述


结语

经测试,MP157串口在接收到正确数据后,将数据上传实现云存储,并且用户可以在界面查看多个设备的实时数据;串口接收到错误数据时也会给予相应提示并且本次数据将不会上传。

至此,云数据库存储多设备数据&界面显示已成功实现。

以上就是全部内容,如有错误请批评指正。

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

STM32MP157实现串口接收数据上云-云数据库存储多设备数据&界面显示实现 的相关文章

  • Android8.0.0-r4的编译系统

    一 概述 1 1 编译系统变化 从Android 7 0开始 xff0c android的编译系统发生了变化 xff0c 之前依赖Makefile组织编译系统 xff0c 从7 0开始逐步引入了kati soong optional未正式使
  • [Android Studio]Android Studio 三种添加插件的方式

    何给Android Studio添加插件 添加插件的路径有三种 xff0c 我把他们分类如下 xff1a 点击设置小按钮 点击 xff3b Plugins xff3d 这里展示的是你已经安装的插件 xff0c 我们可以点击插件名称 xff0
  • Gerrit 服务器插件安装-示例插件delete project

    gerrit2 X 中没法直接删除一个项目 xff0c 之前需要手工删除 xff0c 后来社区提供了一个插件delete project来搞定这个事 xff0c 安装方法如下 xff1a 到 gerritforge xff0c 找到对应的
  • Windows平台下载Android源码(整理)

    Google官方下载源码使用的系统Ubuntu系统 xff0c 不过现在我们需要在Windows系统中下载Android源码文件 网站的地址是 xff1a https android googlesource com 里面包括Android
  • Ubuntu 16.04 文件服务器--samba的安装和配置

    Samba是在Linux系统上实现的SMB xff08 Server Messages Block xff0c 信息服务块 xff09 协议的一款免费软件 它实现在局域网内共享文件和打印机 xff0c 是一个客户机 服务器型协议 客户机通过
  • 深入剖析Android音频之AudioTrack

    播放声音能够用MediaPlayer和AudioTrack xff0c 两者都提供了java API供应用开发人员使用 尽管都能够播放声音 但两者还是有非常大的差别的 当中最大的差别是MediaPlayer能够播放多种格式的声音文件 比如M
  • 树莓派4 运行 Tensorflow Lite

    树莓派4 运行 Tensorflow Lite 1 更新树莓派 span class token function sudo span apt update 2 下载安装脚本 span class token function git sp
  • 操作系统进程进行系统调用详细过程

    翻阅很多资料 xff0c 综合了各处所述进程在进行系统调用之后的状态会如何的解答 xff0c 以下是我个人理解 xff0c 欢迎各位读者纠错 PS 特别感谢以下这个帖子 xff0c 看完他们的讨论我才茅塞顿开 xff0c 非常感谢 xff0
  • 解决Ubuntu 找不到ARM64 的源的问题(转)

    Ubuntu 安装了NVIDIA的驱动还有DriveWokrs之后 xff0c 好像把系统添加了arm64的架构 xff0c 因此 xff0c 在源更新的时候 xff0c 也会更新arm64相关的源 xff0c 但是问题在于 xff0c 用
  • asp.net 实现打开文件所在的文件夹, 本地可以打开,发布后点击按钮没有反应的解决办法

    此类情况大概是安全范畴的问题 确定上传文件夹的共享 xff0c iis 以及电脑帐户 xff0c 以及aspnet 等是否有对应的相关权限 1 确认ASPNET 账户属于管理员级别 2 在 服务 里面找到 IIS Admin xff0c 双
  • numpy 和 tensor 的区别

    关系 xff1a 两者共享内存 xff0c 转换方便 xff0c 没有额外的开销 区别 xff1a 1 数据类型上面的区别 xff1a numpy 默认类型是 float64 int32 tensor 默认类型是float32 int64
  • 关于docker无法apt-get update的问题

    在看这篇文章https www jianshu com p 21d66ca6115e 有一个部分是 但是发现自己的 Node 没有ping命令 想着去apt get update 但是出现如下错误 只要在命令签名加上 sudo 就行
  • ubuntu下安装zip unzip

    安装命令 apt get install zip unzip 执行命令常见错误 xff1a 1 unable to locate package 解决办法 xff1a 执行sudo apt get update命令后再执行安装命令就可以了
  • 平衡小车卡尔曼滤波算法

    最近研究STM32的自平衡小车 xff0c 发现有两座必过的大山 xff0c 一为卡尔曼滤波 xff0c 二为PID算法 网上看了很多关于卡尔曼滤波的代码 xff0c 感觉写得真不咋地 一怒之下 xff0c 自己重写 xff0c 不废话 x
  • FreeRTOS学习-前言与FreeRTOS发行版

    1 前言 因为工作的需要 xff0c 学习FreeRTOS已经有一段时间了 接下来一段时间会定期更新本人学习FreeRTOS的系列笔记 系列笔记主要参考了官方的说明手册和FreeRTOS的源代码 其主要思想是先了解FreeRTOS的对外接口
  • FreeRTOS学习-内存管理

    1 动态内存分配与FreeRTOS 从v9 0 0后 xff0c FreeRTOS开始支持内核对象的静态分配方式 xff0c 因此 xff0c 内存管理库可以被裁剪 但在大多数嵌入式应用中 xff0c 堆的使用还是非常常见的 因此 xff0
  • FreeRTOS学习-任务管理(Task管理)(1)

    1 简介 任务管理 xff08 或称进程管理 xff09 是所有操作系统内核的最基本组成模块之一 xff0c FreeRTOS也不例外 想要了解一个操作系统 xff0c 不得不理解其任务管理的设计和实现 任务管理的介绍由两篇文章组成 xff
  • Java基础之Java枚举

    絮叨 昨天刚好有遇到一个枚举的小问题 xff0c 然后发现自己并不是那么熟悉它 xff0c 然后在开发中 xff0c 枚举用的特别多 xff0c 所以有了今天的文章 什么是枚举 Java中的枚举是一种类型 xff0c 顾名思义 xff1a
  • C++ STL 移动一个vector的元素到另一个vector

    1 背景 有的时候 xff0c 我们需要提取某个现有的vector中的元素到另一个vector中 xff0c 或者对多维的vector进行纬度的转换 在这种场景下 xff0c 往往原始的vector中的数据可能并不需要了 xff0c 为了节
  • Qt/C++ 临时屏蔽控件信号(signal)的实用方法

    1 背景 在使用Qt的控件时 xff0c 我们大概率会使用Qt的信号与槽 xff08 signal slot xff09 的机制来实现自己的UI交互逻辑 由于Qt内置控件的信号种类是有限的 xff0c 我们常常会遇到如下窘境 xff1a 以

随机推荐

  • FreeRTOS学习-队列管理

    1 简介 在FreeRTOS中 xff0c 提供了多种任务间通讯的机制 xff0c 包括消息队列 信号量和互斥锁 事件组 任务通知 xff0c 他们的总体特征如下图所示 xff1a 从图中可以看出 xff0c 消息队列 信号量和互斥锁 事件
  • Qt/C++ 如何删除QListWidget的指定项

    1 简介 QListWidget是Qt中 xff0c 用于展示列表类型数据的常用控件 它提供了一个类似于QListView的列表视图 xff0c 但是具有用于添加和删除项的接口 QListWidget使用一个内部模型来管理列表中的每个QLi
  • C++ std::result_of/std::invoke_result的简明指南

    1 简介 在C 43 43 中 xff0c 有时我们需要获取函数或可调用对象的返回值类型 xff0c 以便进行后续的操作 xff0c 在泛型编程中很常用 xff0c 特别是当不同的参数集的结果类型不同时 在早期的C 43 43 版本中 xf
  • FreeRTOS学习-任务通知(Task Notification)

    1 简介 任务通知本质上就是一种进程间通信机制 之前的文章介绍的消息队列 事件组 信号量等都是一种间接的通信方式 xff0c 而任务通知则是更加直接的方式 xff0c 允许两个任务 xff08 或中断和任务 xff09 之间直接通信 2 任
  • 异常行为分析模型设计

    本文针对异常访问现状及问题进行简要描述 xff0c 在此基础上提出基于一元线性回归的最小二乘法异常访问分析模型 xff0c 通过该模型解决了异常访问中时间与访问间相关性问题 异常访问是指网络行为偏离正常范围的访问情况 异常访问包含多种场景
  • 无人机PX4学习(1)

    内容源自 xff1a PX4飞控用户手册 链接 xff1a https docs px4 io master en Basic concepts Drone an unmanned 34 robotic 34 vehicle that ca
  • 无人机PX4学习(2)

    内容源自 xff1a PX4飞控用户手册 链接 xff1a https docs px4 io master en getting started flight controller selection html Flight Contro
  • 无人机PX4学习(3)

    内容源自 xff1a PX4飞控用户手册 链接 xff1a PX4 Flight Modes Overview PX4 User Guide Flight Mode Section RC或GCS上可以切换飞行模式 xff0c 但有些模式有限
  • 两篇论文入坑AIOps异常检测

    AIOps简介 以下部分内容来源于清华大学裴丹教授发表在 中国计算机学会通讯 第13卷第12期的专栏 基于机器学习的智能运维 我们都知道 xff0c 当代社会生活中的大型软硬件系统为了确保能够安全 可靠地运行 xff0c 需要有专业的运维人
  • python代码,两个4*4旋转矩阵之间的位姿变化,相对旋转矩阵

    python代码 xff0c 两个4 4旋转矩阵之间的位姿变化 xff0c 也就是求两个旋转矩阵之间的相对旋转矩阵 import numpy as np def get transform matrix rot mat1 rot mat2
  • crazyS中给firefly飞机添加两个相机

    firefly飞机中原本只有一个相机 xff0c 由于项目需要一个飞机去识别前方两架飞机 xff0c 因此需要增加一个相机 在rotors descriptioin gt urdf gt mav with vi sensor中可以看到此处
  • gitee(码云)和gitHub的区别

    1 gitee与gitHub概念 xff1f Gitee xff08 码云 xff09 是开源中国社区推出的代码托管协作开发平台 xff0c 支持Git和SVN xff0c 提供免费的私有仓库托管 Gitee专为开发者提供稳定 高效 安全的
  • 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    郭孟琦 43 原创作品转载请注明出处 43 Linux内核分析 MOOC课程http mooc study 163 com course USTC 1000029000 首先我选择的系统调用是122号系统调用 uname 简单的介绍一下un
  • 局域网共享文件夹加密(100%成功版本)

    文章目录 一 创建新用户1 右键此电脑选择管理2 点击本地用户和组3 点击用户A 右键空白区域选择创建新用户B 设置用户名和密码C 取消勾选用户下次登录时须更改密码D 勾选用户不能更改密码和密码永不过期 二 创建共享文件夹1 创建一个新文件
  • STM32PWM--基于HAL库(第十三届蓝桥杯嵌入式模拟题)

    文章目录 前言一 CubeMX配置 第十三届模拟题完整版 二 代码相关定义 声明1 函数声明2 宏定义3 变量定义 三 主要函数1 按键扫描2 配置模式3 LCD显示4 频率检测 TIM2输入捕获中断函数 5 PWM输出 TIM3 6 Ma
  • STM32综合-基于HAL库(第十二届蓝桥杯嵌入式省赛)

    文章目录 前言一 CubeMX配置 第十二届省赛完整版 二 代码相关定义 声明1 函数声明2 宏定义3 变量定义 三 主要函数1 按键扫描2 串口接收中断 定时器中断 接收 3 数据解析4 判定数据正误5 数据更新6 结算7 Main函数
  • STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)

    文章目录 前言一 CubeMX配置 RTC相关 1 使能RTC xff1a 2 进制配置 xff1a 3 初始时间配置 xff1a 4 日期配置 5 闹钟配置 二 代码1 获取时间2 设置闹钟3 闹钟中断函数 三 实验结果总结 前言 相关说
  • STM32LCD--基于HAL库(选中高亮?一文看懂如何玩转高亮显示)

    文章目录 前言一 LCD上的坐标这个坐标是怎么确定的 xff1f X轴Y轴 二 高亮显示类型三 部分真题要求解析四 如何高亮显示选中数据五 代码分析总结 前言 相关说明 xff1a 开发板 xff1a CT117E M4 STM32G431
  • STM32MP157实现串口接收数据上云-MP157串口测试

    文章目录 前言一 需要软件二 minicom配置三 功能选择四 发送数据结语 前言 本篇分享 xff1a 这次将会用几篇博客分享STM32MP157实现串口接收数据上云的一个基础功能 xff0c 实现STM32MP157的串口在接收到数据时
  • STM32MP157实现串口接收数据上云-云数据库存储多设备数据&界面显示实现

    文章目录 前言一 软件安装二 代码改进1 串口接收2 JSON数据解析 三 云产品流转1 作用2 自定义产品功能 amp 添加设备3 创建数据传输规则 四 MYSQL操作五 NODE RED操作1 总体思路2 安装节点3 节点配置4 页面布