基于RFbeam的V-LD1-60GHz毫米波雷达传感器数据获取(通过UART串口来控制模块)

基于RFbeam的V-LD1-60GHz毫米波雷达传感器数据获取(通过UART串口来控制模块)

文章目录

  • V-LD1
  • 命令发送
  • 消息回复
  • 通信示例
  • 雷达数据获取
  • 宏定义
  • 通信代码
  • 运行效果
  • 附录:压缩字符串、大小端格式转换
    • 压缩字符串
      • 浮点数
      • 压缩Packed-ASCII字符串
    • 大小端转换
      • 什么是大端和小端
      • 数据传输中的大小端
      • 总结
      • 大小端转换函数

V-LD1

该模块是由串口进行控制的
在这里插入图片描述
串口协议结构体如下:

#pragma pack(1)
typedef struct
{char Header[4];uint32_t Length;uint8_t DATA[43];
}V_LD1_Struct;
#pragma pack()

头文字是ASCII码字符串格式
然后四字节的Length表示DATA数据长度
数据位小端格式
在这里插入图片描述
通信方式就是先发一个命令 然后等待RESP返回 随后就是命令对应的数据

INIT命令支持修改波特率 但第一次发的时候必须用115200
在这里插入图片描述修改波特率后 直到GBYE命令或复位、断电之前 都是修改后的波特率

命令发送

读取雷达命令就是GNFD 另外配置雷达参数则是SRPS
在这里插入图片描述
在这里插入图片描述

消息回复

发什么命令 就按什么格式回复 但RESP是肯定会最先回复的
另外 读雷达参数用GRPS命令
在这里插入图片描述

通信示例

在这里插入图片描述

雷达数据获取

通过GNFD命令获取雷达数据
如果不需要读大量数据 可以只使用115200
在这里插入图片描述
在这里插入图片描述

宏定义

#ifndef __V_LD1_H__
#define __V_LD1_H__
#include "main.h"#pragma pack(1)
typedef struct
{char Header[4];uint32_t Length;uint8_t DATA[43];
}V_LD1_Struct;
#pragma pack()#pragma pack(1)
typedef struct
{char Version[19];char Unique_ID[12];uint8_t Distance_Range;uint8_t Threshold_Offset;uint16_t Min_Range_Filter;uint16_t Max_Range_Filter;uint8_t Distance_Average_Count;uint8_t Target_Filter;uint8_t Distance_Precision;uint8_t TX_Power;uint8_t Chirp_Integration_Count;uint8_t Short_Range_Distance_Filter;
}V_LD1_Radar_Parameter_Struct;
#pragma pack()#pragma pack(1)
typedef struct
{uint16_t ADC_Value[1024];
}V_LD1_RADC_Struct;
#pragma pack()#pragma pack(1)
typedef struct
{uint16_t Spectrum_Point[512];uint16_t Threshold_Point[512];
}V_LD1_RFFT_Struct;
#pragma pack()#pragma pack(1)
typedef struct
{float Distance;uint16_t Magnitude_Of_Target;
}V_LD1_PDAT_Struct;
#pragma pack()#pragma pack(1)
typedef struct
{uint32_t Frame_ID;
}V_LD1_DONE_Struct;
#pragma pack()typedef enum
{V_LD1_GNFD_RADC = (1<<0),V_LD1_GNFD_RFFT = (1<<1),V_LD1_GNFD_PDAT = (1<<2),V_LD1_GNFD_DONE = (1<<5),
}V_LD1_GNFD_Enum;typedef enum
{V_LD1_RESP_OK			 									= 0,V_LD1_RESP_Unknown_CMD			 				= 1,V_LD1_RESP_Invalid_Parameter_Value	= 2,V_LD1_RESP_Invalid_RPST_Version			= 3,V_LD1_RESP_UART_Error								= 4,V_LD1_RESP_No_Calibration_Value			= 5,V_LD1_RESP_Timeout									= 6,V_LD1_RESP_NO_Programmed						= 7,
}V_LD1_RESP_Enum;extern uint8_t V_LD1_Status;
extern uint8_t V_LD1_RxBit;
extern uint8_t V_LD1_RxBuffer[1024];
extern uint8_t V_LD1_RxFlag;
extern V_LD1_Radar_Parameter_Struct V_LD1_Radar_Parameter_Global;void Init_V_LD1(void);void Read_V_LD1_Radar(void);
#endif

通信代码

# include "V_LD1.h"uint8_t V_LD1_RxBit=0;
uint8_t V_LD1_RxBuffer[1024]={0};
uint8_t V_LD1_RxFlag=0;
uint8_t V_LD1_Status=0;V_LD1_Radar_Parameter_Struct V_LD1_Radar_Parameter_Global={0};V_LD1_Struct Read_V_LD1_Stu(void)
{V_LD1_Struct V_LD1_Stu;memset(&V_LD1_Stu,0,sizeof(V_LD1_Stu));uint8_t i=0;while(V_LD1_Status<2){i++;delay_ms(10);if(i>=50){V_LD1_RxBit=0;V_LD1_Status=0;V_LD1_RxFlag=0;return V_LD1_Stu;}}memcpy(&V_LD1_Stu.Header[0],&V_LD1_RxBuffer[0],4);memcpy(&V_LD1_Stu.Length,&V_LD1_RxBuffer[4],4);memcpy(&V_LD1_Stu.DATA[0],&V_LD1_RxBuffer[8],V_LD1_Stu.Length);V_LD1_RxBit=0;V_LD1_Status=0;V_LD1_RxFlag=0;return V_LD1_Stu;
}void Send_V_LD1_Stu(V_LD1_Struct V_LD1_Stu)
{uint8_t buf[51]={0};memcpy(buf,&V_LD1_Stu,V_LD1_Stu.Length+8);V_LD1_RxBit=0;V_LD1_Status=0;V_LD1_RxFlag=0;HAL_UART_Transmit(&V_LD1_UART_Handle,buf,V_LD1_Stu.Length+8,0xFFFF);
}int Read_V_LD1_RESP(void)
{V_LD1_Struct V_LD1_Stu=Read_V_LD1_Stu();if (V_LD1_Stu.Header[0]=='R' && V_LD1_Stu.Header[1]=='E' && V_LD1_Stu.Header[2]=='S' && V_LD1_Stu.Header[3]=='P' && V_LD1_Stu.Length==1){return V_LD1_Stu.DATA[0];}else{return -1;}
}int Read_V_LD1_VERS(V_LD1_Struct* V_LD1)
{V_LD1_Struct V_LD1_Stu=Read_V_LD1_Stu();if (V_LD1_Stu.Header[0]=='V' && V_LD1_Stu.Header[1]=='E' && V_LD1_Stu.Header[2]=='R' && V_LD1_Stu.Header[3]=='S' && V_LD1_Stu.Length==19){memcpy(V_LD1,&V_LD1_Stu,27);return 0;}else{return -1;}
}void Read_V_LD1_Radar(void)
{V_LD1_Struct V_LD1_Stu={0};V_LD1_PDAT_Struct PDAT_Stu = {0};GUI_Struct Stu={0};uint8_t RESP_Code=0;memcpy(&V_LD1_Stu.Header[0],"GNFD",4);V_LD1_Stu.Length=1;V_LD1_Stu.DATA[0]=0|V_LD1_GNFD_PDAT;	Send_V_LD1_Stu(V_LD1_Stu);RESP_Code=Read_V_LD1_RESP();printf("[INFO] GNFD PDAT RESP: %d\n",RESP_Code);V_LD1_Stu=Read_V_LD1_Stu();if (V_LD1_Stu.Header[0]=='P' && V_LD1_Stu.Header[1]=='D' && V_LD1_Stu.Header[2]=='A' && V_LD1_Stu.Header[3]=='T' && V_LD1_Stu.Length==6){memcpy(&PDAT_Stu,&V_LD1_Stu.DATA[0],6);printf("[INFO] PDAT: %f %d\n",PDAT_Stu.Distance,PDAT_Stu.Magnitude_Of_Target);Stu.COM=0x00;Stu.BCNT[0]=0;Stu.BCNT[1]=6;memcpy(&Stu.DATA[0],&PDAT_Stu,6);GUI_Slave_Send(Stu);}
}void Init_Radar_Parameter(void)
{V_LD1_Radar_Parameter_Global.Distance_Range=0;V_LD1_Radar_Parameter_Global.Threshold_Offset=60;V_LD1_Radar_Parameter_Global.Min_Range_Filter=5;V_LD1_Radar_Parameter_Global.Max_Range_Filter=460;V_LD1_Radar_Parameter_Global.Distance_Average_Count=5;V_LD1_Radar_Parameter_Global.Target_Filter=0;V_LD1_Radar_Parameter_Global.Distance_Precision=1;V_LD1_Radar_Parameter_Global.TX_Power=31;V_LD1_Radar_Parameter_Global.Chirp_Integration_Count=20;V_LD1_Radar_Parameter_Global.Short_Range_Distance_Filter=0;
}void Init_V_LD1(void)
{V_LD1_Struct V_LD1_Stu={0};V_LD1_RxBit=0;V_LD1_Status=0;V_LD1_RxFlag=0;uint8_t RESP_Code=0;memset(V_LD1_RxBuffer,0,sizeof(V_LD1_RxBuffer));memcpy(&V_LD1_Stu.Header[0],"RFSE",4);V_LD1_Stu.Length=0;Send_V_LD1_Stu(V_LD1_Stu);RESP_Code=Read_V_LD1_RESP();printf("[INFO] RFSE RESP: %d\n",RESP_Code);memcpy(&V_LD1_Stu.Header[0],"INIT",4);V_LD1_Stu.Length=1;V_LD1_Stu.DATA[0]=0;	Send_V_LD1_Stu(V_LD1_Stu);RESP_Code=Read_V_LD1_RESP();printf("[INFO] INIT RESP: %d\n",RESP_Code);if(RESP_Code==V_LD1_RESP_OK){if(Read_V_LD1_VERS(&V_LD1_Stu)==0){printf("[INFO] V_LD1_Version: %s\n",V_LD1_Stu.DATA);memcpy(&V_LD1_Radar_Parameter_Global.Version[0],&V_LD1_Stu.DATA[0],19);}}memcpy(&V_LD1_Stu.Header[0],"TGFI",4);V_LD1_Stu.Length=1;	V_LD1_Stu.DATA[0]=0	;Send_V_LD1_Stu(V_LD1_Stu);RESP_Code=Read_V_LD1_RESP();printf("[INFO] TGFI RESP: %d\n",RESP_Code);memcpy(&V_LD1_Stu.Header[0],"INTN",4);V_LD1_Stu.Length=1;	V_LD1_Stu.DATA[0]=20;Send_V_LD1_Stu(V_LD1_Stu);RESP_Code=Read_V_LD1_RESP();printf("[INFO] INTN RESP: %d\n",RESP_Code);memcpy(&V_LD1_Stu.Header[0],"SRDF",4);V_LD1_Stu.Length=1;	V_LD1_Stu.DATA[0]=0;Send_V_LD1_Stu(V_LD1_Stu);RESP_Code=Read_V_LD1_RESP();printf("[INFO] SRDF RESP: %d\n",RESP_Code);Read_V_LD1_Radar();	
}

运行效果

在这里插入图片描述

附录:压缩字符串、大小端格式转换

压缩字符串

首先HART数据格式如下:
在这里插入图片描述
在这里插入图片描述
重点就是浮点数和字符串类型
Latin-1就不说了 基本用不到

浮点数

浮点数里面 如 0x40 80 00 00表示4.0f

在HART协议里面 浮点数是按大端格式发送的 就是高位先发送 低位后发送

发送出来的数组为:40,80,00,00

但在C语言对浮点数的存储中 是按小端格式来存储的 也就是40在高位 00在低位
浮点数:4.0f
地址0x1000对应00
地址0x1001对应00
地址0x1002对应80
地址0x1003对应40

若直接使用memcpy函数 则需要进行大小端转换 否则会存储为:
地址0x1000对应40
地址0x1001对应80
地址0x1002对应00
地址0x1003对应00

大小端转换:

void swap32(void * p)
{uint32_t *ptr=p;uint32_t x = *ptr;x = (x << 16) | (x >> 16);x = ((x & 0x00FF00FF) << 8) | ((x >> 8) & 0x00FF00FF);*ptr=x;
}

压缩Packed-ASCII字符串

本质上是将原本的ASCII的最高2位去掉 然后拼接起来 比如空格(0x20)
四个空格拼接后就成了
1000 0010 0000 1000 0010 0000
十六进制:82 08 20
对了一下表 0x20之前的识别不了
也就是只能识别0x20-0x5F的ASCII表
在这里插入图片描述

压缩/解压函数后面再写:

//传入的字符串和数字必须提前声明 且字符串大小至少为str_len 数组大小至少为str_len%4*3 str_len必须为4的倍数
uint8_t Trans_ASCII_to_Pack(uint8_t * str,uint8_t * buf,const uint8_t str_len)
{if(str_len%4){return 0;}uint8_t i=0;memset(buf,0,str_len/4*3);	  for(i=0;i<str_len;i++){if(str[i]==0x00){str[i]=0x20;}}for(i=0;i<str_len/4;i++){buf[3*i]=(str[4*i]<<2)|((str[4*i+1]>>4)&0x03);buf[3*i+1]=(str[4*i+1]<<4)|((str[4*i+2]>>2)&0x0F);buf[3*i+2]=(str[4*i+2]<<6)|(str[4*i+3]&0x3F);}return 1;
}//传入的字符串和数字必须提前声明 且字符串大小至少为str_len 数组大小至少为str_len%4*3 str_len必须为4的倍数
uint8_t Trans_Pack_to_ASCII(uint8_t * str,uint8_t * buf,const uint8_t str_len)
{if(str_len%4){return 0;}uint8_t i=0;memset(str,0,str_len);for(i=0;i<str_len/4;i++){str[4*i]=(buf[3*i]>>2)&0x3F;str[4*i+1]=((buf[3*i]<<4)&0x30)|(buf[3*i+1]>>4);str[4*i+2]=((buf[3*i+1]<<2)&0x3C)|(buf[3*i+2]>>6);str[4*i+3]=buf[3*i+2]&0x3F;}return 1;
}

大小端转换

在串口等数据解析中 难免遇到大小端格式问题

什么是大端和小端

所谓的大端模式,就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

所谓的小端模式,就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

简单来说:大端——高尾端,小端——低尾端

举个例子,比如数字 0x12 34 56 78在内存中的表示形式为:

1)大端模式:

低地址 -----------------> 高地址

0x12 | 0x34 | 0x56 | 0x78

2)小端模式:

低地址 ------------------> 高地址

0x78 | 0x56 | 0x34 | 0x12

可见,大端模式和字符串的存储模式类似。

数据传输中的大小端

比如地址位、起止位一般都是大端格式
如:
起始位:0x520A
则发送的buf应为{0x52,0x0A}

而数据位一般是小端格式(单字节无大小端之分)
如:
一个16位的数据发送出来为{0x52,0x0A}
则对应的uint16_t类型数为: 0x0A52

而对于浮点数4.0f 转为32位应是:
40 80 00 00

以大端存储来说 发送出来的buf就是依次发送 40 80 00 00

以小端存储来说 则发送 00 00 80 40

由于memcpy等函数 是按字节地址进行复制 其复制的格式为小端格式 所以当数据为小端存储时 不用进行大小端转换
如:

uint32_t dat=0;
uint8_t buf[]={0x00,0x00,0x80,0x40};memcpy(&dat,buf,4);float f=0.0f;f=*((float*)&dat); //地址强转printf("%f",f);

或更优解:

   uint8_t buf[]={0x00,0x00,0x80,0x40};   float f=0.0f;memcpy(&f,buf,4);

而对于大端存储的数据(如HART协议数据 全为大端格式) 其复制的格式仍然为小端格式 所以当数据为小端存储时 要进行大小端转换
如:

uint32_t dat=0;
uint8_t buf[]={0x40,0x80,0x00,0x00};memcpy(&dat,buf,4);float f=0.0f;swap32(&dat); //大小端转换f=*((float*)&dat); //地址强转printf("%f",f);

或:

uint8_t buf[]={0x40,0x80,0x00,0x00};memcpy(&dat,buf,4);float f=0.0f;swap32(&f); //大小端转换printf("%f",f);

或更优解:

uint32_t dat=0;
uint8_t buf[]={0x40,0x80,0x00,0x00};float f=0.0f;dat=(buf[0]<<24)|(buf[0]<<16)|(buf[0]<<8)|(buf[0]<<0)f=*((float*)&dat);

总结

固 若数据为小端格式 则可以直接用memcpy函数进行转换 否则通过移位的方式再进行地址强转

对于多位数据 比如同时传两个浮点数 则可以定义结构体之后进行memcpy复制(数据为小端格式)

对于小端数据 直接用memcpy写入即可 若是浮点数 也不用再进行强转

对于大端数据 如果不嫌麻烦 或想使代码更加简洁(但执行效率会降低) 也可以先用memcpy写入结构体之后再调用大小端转换函数 但这里需要注意的是 结构体必须全为无符号整型 浮点型只能在大小端转换写入之后再次强转 若结构体内采用浮点型 则需要强转两次

所以对于大端数据 推荐通过移位的方式来进行赋值 然后再进行个别数的强转 再往通用结构体进行写入

多个不同变量大小的结构体 要主要字节对齐的问题
可以用#pragma pack(1) 使其对齐为1
但会影响效率

大小端转换函数

直接通过对地址的操作来实现 传入的变量为32位的变量
中间变量ptr是传入变量的地址

void swap16(void * p)
{uint16_t *ptr=p;uint16_t x = *ptr;x = (x << 8) | (x >> 8);*ptr=x;
}void swap32(void * p)
{uint32_t *ptr=p;uint32_t x = *ptr;x = (x << 16) | (x >> 16);x = ((x & 0x00FF00FF) << 8) | ((x >> 8) & 0x00FF00FF);*ptr=x;
}void swap64(void * p)
{uint64_t *ptr=p;uint64_t x = *ptr;x = (x << 32) | (x >> 32);x = ((x & 0x0000FFFF0000FFFF) << 16) | ((x >> 16) & 0x0000FFFF0000FFFF);x = ((x & 0x00FF00FF00FF00FF) << 8) | ((x >> 8) & 0x00FF00FF00FF00FF);*ptr=x;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/141974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详情API接口上货搬运获取信息API接口

一、拼多多详情API接口概述 拼多多详情API接口是拼多多开放平台提供的一套接口&#xff0c;用于获取商品详情信息&#xff0c;包括商品标题、描述、价格、库存等。通过该接口&#xff0c;商家可以快速获取商品信息&#xff0c;并自由组合、定制&#xff0c;以实现个性化的详情…

将自己的代码封装成python库

创建自己的 Python 库并发布供他人使用&#xff0c;主要分以下几步&#xff1a; 1.创建你的项目结构&#xff1a;这通常包括一个包含你的代码的 src 目录&#xff0c;一个测试目录&#xff0c;一个用于描述你的项目的 README.md 文件&#xff0c;一个 setup.py 文件&#xff0…

【广州华锐视点】海外制片人VR虚拟情景教学带来全新的学习体验

虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种利用电脑模拟产生一个三维的虚拟世界&#xff0c;提供用户关于视觉、听觉、触觉等感官的模拟体验的技术。随着科技的进步&#xff0c;VR已经被广泛应用到许多领域&#xff0c;包括游戏、教育、医疗、房…

在qml中,text如何左对齐,对齐方式有哪些?如何换行?

在Qt Quick&#xff08;即QML&#xff09;中&#xff0c;你可以使用Text组件的horizontalAlignment属性来控制文本的对齐方式。以下是一些常用的对齐方式&#xff1a; Align.Left: 文本左对齐。这是默认的对齐方式。 Align.Center: 文本居中对齐。 Align.Right: 文本右对齐。 …

K8S容器持续Terminating无法正常关闭(sider-car容器异常,微服务容器正常)

问题 K8S上出现大量持续terminating的Pod&#xff0c;无法通过常规命令删除。需要编写脚本批量强制删除持续temminating的Pod&#xff1a;contribution-xxxxxxx。 解决 获取terminating状态的pod名称的命令&#xff1a; # 获取media命名空间下&#xff0c;名称带contributi…

Oracle简单高效删除重复记录

DELETE FROM your_table WHERE rowid not in(SELECT MAX(rowid)FROM your_tableGROUP BY column1, column2, ...);在这个SQL语句中&#xff0c;your_table是你的表名&#xff0c;column1, column2, ...是需要考虑的列&#xff0c;这些列决定了哪些记录被认为是重复的。这个语句…

通过docker-compose部署elk日志系统,并使用springboot整合

ELK是一种强大的分布式日志管理解决方案&#xff0c;它由三个核心组件组成&#xff1a; Elasticsearch&#xff1a;作为分布式搜索和分析引擎&#xff0c;Elasticsearch能够快速地存储、搜索和分析大量的日志数据&#xff0c;帮助用户轻松地找到所需的信息。 Logstash&#xf…

android设置页面顶部沉浸式布局并透明显示

// 设置沉浸式布局标志位if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) {frameLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);} else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KIT…

深度学习之基于Pytorch服装图像分类识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介系统组成1. 数据集准备2. 数据预处理3. 模型构建4. 模型训练5. 模型评估 PyTorch的优势 二、功能三、系统四. 总结 一项目简介 深度学习在计算机视觉领域的…

软件测试自学指南,十年阿里测试工程师的建议

通过技能提升&#xff0c;入行IT可以的&#xff0c;但得先积累足够的经验&#xff0c;才能拿高薪&#xff0c;有个成长的过程。 软件测试岗介绍 软件测试岗位主要负责系统的测试工作&#xff0c;属于IT项目中的质量管理&#xff08;QA&#xff09;模块。 这个岗位分为两种类…

Adobe研究人员研发新AI模型LRM:实现从2D样本瞬时生成3D图像

由Adobe Research和澳大利亚国立大学&#xff08;ANU&#xff09;联合研发的人工智能模型宣布了一项突破性的成果&#xff0c;能够从单一的2D图像中生成3D图像。 研究人员表示&#xff0c;他们的新算法在大规模图像样本上进行训练&#xff0c;可以在几秒钟内生成这样的3D图像。…

虚拟机Ubuntu安装Tamarin prover记录

安装vmware VMware Workstation Pro 16 链接&#xff1a;https://pan.baidu.com/s/1_InZkEje8NjRN6Q-ypccQg 提取码&#xff1a;2023 许可证密钥 ZF3R0-FHED2-M80TY-8QYGC-NPKYF安装ubuntu 22.4 链接&#xff1a;https://pan.baidu.com/s/1DwCaUw0f8N3Ka1tNAWDacg 提取码&…

【LIUNX】配置缓存DNS服务

配置缓存DNS服务 A.安装bind bind-utils1.尝试修改named.conf配置文件2.测试nslookup B.修改named.conf配置文件1.配置文件2.再次测试 缓存DNS服务器&#xff1a;只提供域名解析结果的缓存功能&#xff0c;目的在于提高数据查询速度和效率&#xff0c;但是没有自己控制的区域地…

阿里云国际站:应用实时监控服务

文章目录 一、阿里云应用实时监控服务的概念 二、阿里云应用实时监控服务的优势 三、阿里云应用实时监控服务的功能 四、写在最后 一、阿里云应用实时监控服务的概念 应用实时监控服务 (Application Real-Time Monitoring Service) 作为一款云原生可观测产品平台&#xff…

记忆科技携手中国电信,一站式存储打造坚实数字底座

11月10日&#xff0c;以“数字科技 焕新启航”为主题的2023数字科技生态大会在广州盛大开幕&#xff0c;本次大会由中国电信、广东省人民政府联合举办&#xff0c;是一场数字科技领域的年度盛会。忆联母公司记忆科技作为中国电信的合作伙伴之一受邀参会&#xff0c;深度参与了大…

Flink SQL -- 命令行的使用

1、启动Flink SQL 首先启动Flink的集群&#xff0c;选择独立集群模式或者是session的模式。此处选择是时session的模式&#xff1a;yarn-session.sh -d 在启动Flink SQL的client&#xff1a; sql-client.sh 2、kafka SQL 连接器 在使用kafka作为数据源的时候需要上传jar包到…

Ubuntu 22.04 (WSL2) 安装 libssl1.1

废话不多说&#xff01;&#xff01;&#xff01; 步骤一&#xff1a; echo "deb http://security.ubuntu.com/ubuntu focal-security main" | sudo tee /etc/apt/sources.list.d/focal-security.list 步骤二&#xff1a; sudo apt-get update 步骤三&#xff1a…

2311rust特征

Rust无成本抽象 Rust中抽象基石是trait: 1,Trait是Rust中唯一的接口概念.多个类型可实现一个特征,事实上,可为现有类型提供新的特征实现.另一方面,想抽象未知类型时,找特征就行了. 2,与C模板一样,可静态分发特征. 3,可动态分发特征.有时确实需要间接,所以不必运行时"擦除…

比较一个5点的结构对平面的分割

5a61 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 计算5a61&#xff0c; 当空间的尺寸是8*8的时候 21 21 5 19 26 26 21 21 21 21 5 19 26 26 21 21 16 16 1 1 8 8 16 16 34 34 14 39 40 1 34 34 34 34 14 39 1 40 34 34 …

LabVIEW中NIGPIB设备与驱动程序不相关的MAX报错

LabVIEW中NIGPIB设备与驱动程序不相关的MAX报错 当插入GPIB-USB设备时&#xff0c;看到了NI MAX中列出该设备&#xff0c;但却显示了黄色警告指示&#xff0c;并且指出Windows没有与您的设备相关的驱动程序。 解决方案 需要安装能兼容的NI-488.2驱动程序。 通过交叉参考以下有…