当前位置: 首页 > article >正文

5分钟完成 RS6013A 上位机连接与第一个示例程序(含截图)

在雷达技术教学与科研中FMCW调频连续波雷达因其结构简单、测距精度高、无距离盲区等优点已成为毫米波雷达应用的主流方案。然而许多初学者在面对雷达硬件时往往被复杂的寄存器配置、数据协议和信号处理流程所困扰难以快速上手。RS6013A 实验套件正是为解决这一痛点而设计。它是一款基于 FMCW 原理的 60GHz 毫米波雷达开发平台集成了射频前端、天线、时钟和信号处理单元通过 USB 接口即可与 PC 连接输出原始 ADC 数据或预处理后的点云信息。套件提供丰富的示例代码帮助用户从零开始快速搭建自己的雷达应用。此外它还是一款人工智能实验套件支持用户在设备端运行自定义神经网络模型实现端侧AI功能这将进一步拓展雷达在智能探测、实时决策场景的应用边界。本文将带你用 5 分钟时间完成 RS6013A 与 PC 的连接并运行第一个 MATLAB 示例程序。我们将详细讲解串口初始化、帧同步与数据解码、实时数据采集与显示的全过程。通过本教程你将直观地看到雷达回波的中频信号波形为后续的距离测量、速度估计甚至成像算法打下基础。一、准备工作1.硬件清单RS6013A 实验套件含雷达模块、3 个接收天线、1 个发射天线、USB 数据线。一台装有 Windows 10/11 的 PCLinux 或 macOS 也可但驱动需另行配置。2.软件环境MATLAB R2020a 或更新版本需安装 Instrument Control Toolbox 以支持串口通信。如果使用 Python可安装 pyserial、numpy、matplotlib 等库本文以 MATLAB 为例。USB 转串口驱动RS6013A 内置 CP210x 芯片系统通常自动识别。若设备管理器中未出现对应 COM 口可前往 Silicon Labs 官网下载驱动。3.连接与检查用 USB 线将 RS6013A 连接至 PC。打开设备管理器Windows展开“端口COM 和 LPT”应看到系统自动识别并分配的 COM 号例如 COM5。记住该端口号。若未出现尝试更换 USB 线或重新安装驱动。连接完毕后开发板指示灯亮起。其中红灯常亮绿灯闪烁。至此硬件准备就绪我们开始编写第一个示例程序。二、第一步串口初始化配置与实现1.目标打开与 RS6013A 对应的串口设置正确的波特率尽管模块通过 USB 传输实际波特率可任意但需与固件匹配清空缓冲区为后续数据接收做准备。2.代码实现在 MATLAB 中我们使用 serialport 函数创建串口对象。以下为初始化代码%% 功能在线ADC数据采集clc;clear;close all;clear serialPort;% 先关闭可能存在的串口对象%% 定义串口对象serialPortserialport(COM5,921600);% 端口号需替换为实际值波特率可任意flush(serialPort);% 清空输入输出缓冲区% 雷达参数rx_antennas[1,1,1];% 雷达3个接收天线状态 0: disable, 1:enablenum_samples_per_chirp64;% 雷达的采样点数num_chirps_per_frame32;% 雷达的chirp个数% 定义雷达单天线buffer的大小 采样点数 * chirp个数 * 12/8 (12bit ADC, 8bit数据)buffer_sizenum_samples_per_chirp*num_chirps_per_frame*12/8;% 定义二维buffer, 12bit转16bit后的数据bufferzeros(buffer_size/3*2,sum(rx_antennas));关键点说明serialport 的第一个参数是端口名如 “COM5”。请根据设备管理器中的实际端口修改。第二个参数为波特率这里设为 921600。注释中特别说明“本模块采用 USB 传输数据波特率无效”这是因为 USB 模拟的串口实际传输速度由 USB 协议决定波特率仅用于兼容传统串口软件因此可任意设置常用 115200、921600 等。flush(serialPort) 清除缓冲区中可能残留的旧数据确保后续读取是从当前时刻开始的新数据。如果端口打开失败MATLAB 会报告错误。常见原因包括端口号错误、驱动未安装、或被其他程序占用。此时请检查设备管理器并关闭其他串口监视软件。三、第二步帧头同步与数据解码的原理与实现1.RS6013A 数据帧格式RS6013A 以数据帧frame为单位向上位机发送 ADC 采样数据。每一帧对应一个完整的 chirp 序列即一帧包含多个 chirp每个 chirp 包含多个采样点。数据帧格式设计如下内容长度字节说明帧头标志1固定为 0x00用于同步起始帧头序列7固定为 [1,2,3,4,5,6,7]进一步增强同步可靠性有效数据可变包含所有接收天线的 ADC 原始数据格式见下文帧尾标志8固定为 [0,1,2,3,4,5,6,7]用于校验一帧的完整性有效数据编码RS6013A 的 ADC 分辨率为 12 位每个采样点占用 12 bit。为节省传输带宽数据以字节流形式连续发送每 3 个字节承载 2 个 12-bit 样本3 字节 24 bit 12 bit × 2。具体排列方式如下第 1 字节的高 4 位 第 2 字节的低 4 位组成第 1 个 12-bit 样本第 2 字节的高 4 位 第 3 字节组成第 2 个 12-bit 样本。对于多天线系统各天线的数据按天线顺序交错排列。例如 3 个天线使能时字节流依次为天线1样本1(高4位)天线1样本1(低8位的一部分)……具体可参考解码代码。数据量计算每 chirp 采样点数 num_samples_per_chirp本例中为 64每帧包含的 chirp 数 num_chirps_per_frame本例中为 32单个天线一帧的样本总数 64 × 32 2048 个样本每个样本 12 bit 1.5 字节故单天线数据字节数 2048 × 1.5 3072 字节若 3 个天线均使能一帧有效数据字节数 3072 × 3 9216 字节加上帧头8 字节和帧尾8 字节一帧总长度为 9216 16 9232 字节。2.帧同步实现由于串口是流式传输程序需要从连续的字节流中准确地找到每一帧的起始。本示例采用两阶段同步策略粗同步逐字节读取直到读到 0x00。精同步读取后续 7 个字节检查是否等于 [1,2,3,4,5,6,7]。若匹配则认为找到帧头否则继续搜索。代码实现如下whiletrue dataread(serialPort,1,uint8);% 读取串口数据ifdatahex2dec(00)% 按字节读取找到帧头[0]dataread(serialPort,7,uint8);% 读取帧头后面的数据ifsum(data[1,2,3,4,5,6,7])7% 判断帧头后面的数据是否为[1,2,3,4,5,6,7]break;% 找到帧头后退出循环endendend这段代码首先进入while循环每次读取一个字节若该字节为 0x00则再读取 7 个字节并与预定义的序列比较。若完全匹配说明找到了正确的帧起始位置退出同步循环。否则继续寻找下一个 0x00。注意read 函数在指定超时时间内未读到足够字节时会报错因此建议在创建 serialPort 时设置合理的超时如 5 秒或在代码中添加异常处理。3.数据解码原理找到帧头后即可开始读取一整帧的数据。帧长度已知根据天线使能情况计算因此可以直接读取固定字节数% 在循环中读取一帧dataread(serialPort,sum(rx_antennas)*buffer_size8,uint8);这里读取的字节数为 sum(rx_antennas)* buffer_size 8其中 buffer_size 是单天线数据字节数8 是帧尾的 8 个字节。读取后将最后 8 个字节取出与帧尾序列比较确保帧传输无误frame_headerdata(end-7:end);ifsum(frame_header[0,1,2,3,4,5,6,7])~8break;% 帧尾不匹配可能发生错位退出循环enddatadata(1:end-8);% 截去帧尾得到纯有效数据接下来是最关键的 12-bit 到 16-bit 转换。有效数据部分是一个字节数组每 3 个字节对应 2 个 12-bit 样本。我们需要将这两个样本提取出来存储为 16-bit 整数高 4 位补 0。转换过程依赖于天线的数量因为多天线时数据是交错的。示例中通过 step 3 *sum(rx_antennas) 计算出每次循环处理的字节数然后针对不同天线数编写了三个分支。step3*sum(rx_antennas);% 将3byte数据转换为2byte数据switchstep% 循环读取3byte数据 12bit *2 16bit* 2case3%只有1个接收天线fori1:length(rx_antennas)% 遍历rx_antennasifrx_antennas(i)1rxi;endendfori1:step:length(data)buffer(((i2)/3)*2-1,rx)bitshift(data(i),4)bitshift(data(i1),-4);buffer(((i2)/3)*2,rx)bitshift(bitand(data(i1),hex2dec(0F)),8)data(i2);endcase6% 有2个接收天线ifrx_antennas(1)rx1;ifrx_antennas(2)ry2;elsery3;endelserx2;ry3;endfori1:step:length(data)buffer(((i5)/6)*2-1,rx)bitshift(data(i),4)bitshift(data(i1),-4);buffer(((i5)/6)*2-1,ry)bitshift(bitand(data(i1),hex2dec(0F)),8)data(i2);buffer(((i5)/6)*2,rx)bitshift(data(i3),4)bitshift(data(i4),-4);buffer(((i5)/6)*2,ry)bitshift(bitand(data(i4),hex2dec(0F)),8)data(i5);endcase9%有3个接收天线fori1:step:length(data)%8bit的data解码为12bit的bufferbuffer(((i8)/9)*2-1,1)bitshift(data(i),4)bitshift(data(i1),-4);buffer(((i8)/9)*2-1,2)bitshift(bitand(data(i1),hex2dec(0F)),8)data(i2);buffer(((i8)/9)*2-1,3)bitshift(data(i3),4)bitshift(data(i4),-4);buffer(((i8)/9)*2,1)bitshift(bitand(data(i4),hex2dec(0F)),8)data(i5);buffer(((i8)/9)*2,2)bitshift(data(i6),4)bitshift(data(i7),-4);buffer(((i8)/9)*2,3)bitshift(bitand(data(i7),hex2dec(0F)),8)data(i8);endend这段代码看似复杂实则规律清晰。以 3 天线情况为例每 9 个字节3 天线 × 3 字节为一组解析出 6 个 12-bit 样本每个天线 2 个样本。以第一个天线为例样本 1取 data(i) 左移 4 位加上 data(i1) 右移 4 位即取 data(i1) 的高 4 位作为低 4 位组合成 16 位整数。样本 2取 data(i1) 的低 4 位通过与 0x0F 按位与左移 8 位再加上 data(i2)组合成第二个样本。其他天线以此类推。最终 buffer 是一个二维数组行数为样本总数每帧样本数 采样点数 × chirp 数列数为天线数每个元素为 16-bit 整数实际有效位 12-bit。四、第三步数据采集与显示的基本流程1.实时数据采集循环在完成一帧的解码后我们通常希望连续采集多帧数据并实时观察信号波形。示例程序使用一个 while true 循环每次迭代处理一帧直至达到设定的帧数500 帧或用户主动中断。FrameCount0;% 帧计数器DataFrames500;% 数据采集帧数SaveFlag1;% 数据存储标志whiletrue FrameCountFrameCount1;% 读取并解码一帧代码如前所述% ...%% 数据重组Rx1reshape(buffer(:,1),num_samples_per_chirp,num_chirps_per_frame);Rx2reshape(buffer(:,2),num_samples_per_chirp,num_chirps_per_frame);Rx3reshape(buffer(:,3),num_samples_per_chirp,num_chirps_per_frame);%% 绘图每10帧刷新一次ifmod(FrameCount,10)0||FrameCount1% 绘制三个天线的时域波形subplot(131);plot(Rx1);grid onxlabel(采样点数(N));ylabel(幅度);title([RX1时域波形 第,num2str(FrameCount),帧]);legend(arrayfun((x)[chirp,num2str(x)],1:num_chirps_per_frame,UniformOutput,false));subplot(132);plot(Rx2);grid on;title(RX2);% 类似subplot(133);plot(Rx3);grid on;title(RX3);drawnow;% 强制刷新图形end%% 数据存储ifSaveFlagRadarData(FrameCount).Rx1Rx1;RadarData(FrameCount).Rx2Rx2;RadarData(FrameCount).Rx3Rx3;ifFrameCountDataFrames save RadarData.mat RadarData;break;endendend关键点数据重组buffer 中每一列是一个天线在一帧中的所有样本按采样点- chirp 顺序线性排列。通过 reshape 可以恢复为二维矩阵行对应采样点索引列对应 chirp 索引。这样每一列就是一个 chirp 的 ADC 数据便于后续分析。绘图优化实时绘图非常消耗资源因此每 10 帧更新一次画面避免卡顿。subplot 将三个天线并排显示方便对比。数据存储将每一帧的结构体存入 RadarData 数组达到指定帧数后保存为 .mat 文件供离线处理使用。2.运行效果运行程序后MATLAB 会打开一个图形窗口动态更新三个接收天线的时域波形。正常情况下你应该看到类似正弦波或带有噪声的起伏波形这反映了雷达前方物体的反射信号。用手在雷达前缓慢移动波形会发生明显变化直观感受雷达探测效果。五、总结与拓展1.回顾通过不到 5 分钟的时间我们完成了从硬件连接、串口初始化、帧同步解码到实时数据显示的全流程。这一简单示例验证了 RS6013A 实验套件的即插即用特性让初学者快速跨越了雷达数据获取的门槛。2.RS6013A 实验套件优势一体化设计无需复杂的射频调试USB 供电即用。开放协议数据帧格式公开用户可轻松自定义上位机。多语言支持适配MATLAB、Python等不同开发环境。丰富的教学资源配套实验指导书涵盖 FMCW 原理、测距测速、SAR 成像等进阶内容。3.下一步建议掌握了原始 ADC 数据的获取方法后你可以在此基础上实现更多功能一维距离像对每个 chirp 的采样点做 FFT得到距离维信息。速度估计对多个 chirp 做慢时间维 FFT提取多普勒频率。二维成像结合多个天线进行角度估计或 SAR 成像。实时处理将 MATLAB 代码移植到 Python结合 GUI 库构建完整的雷达演示系统。4.获取更多资料如需 RS6013A 的详细数据手册、原理图、更多示例代码或购买信息请访问官网或联系技术支持。

相关文章:

5分钟完成 RS6013A 上位机连接与第一个示例程序(含截图)

在雷达技术教学与科研中,FMCW(调频连续波)雷达因其结构简单、测距精度高、无距离盲区等优点,已成为毫米波雷达应用的主流方案。然而,许多初学者在面对雷达硬件时,往往被复杂的寄存器配置、数据协议和信号处…...

跨平台符号表生成规则详解:Windows/Linux/macOS/OHOS

本文详细介绍 C/C 项目在各平台的符号表生成策略,包括 MSVC PDB 生成、GCC/Clang DWARF 生成、以及 strip 操作的原子性保证。一、各平台符号格式对比平台编译器符号格式文件位置备注WindowsMSVCPDB (Program Database)与 DLL 分离无需 stripLinuxGCC/ClangDWARF嵌入…...

品牌关键词优化:如何用5步提升你的内容搜索排名?

随着生成式AI的兴起,GEO(生成式引擎优化)已成为企业提升品牌曝光和流量获取的重要手段。为了帮助大家更好地选择适合自己的GEO服务提供商,我们对市面上主流的GEO产品进行了深度测评。以下是本次参与测评的产品名单:沐廉…...

Matlab几何特征地图法实现智能车二维路径规划

Matlab几何特征地图法 单个机器人(智能车) 二维路径规划 静态环境全局路径规划 避障 有局部避障和路径冲突解决策略源程序仿真带注释 附操作视频在智能车的二维路径规划领域,尤其是在静态环境下的全局路径规划,Matlab 的几何特征地…...

JavaScript重定义this指向(apply、call、bind)

一、apply() 在JavaScript中,apply()是函数的原型方法(Function.prototype.apply),用于调用一个函数,并显式指定该函数内部的this值,同时以数组(或类数组对象)的形式传入参数。基本语…...

智慧教育+虚拟仿真:解锁煤矿专业实训新范式

煤炭作为我国主体能源,行业安全生产与智能化转型对高素质技术技能人才提出迫切需求,职业院校煤矿专业迎来发展新机遇的同时,也面临着实训教学与行业需求精准对接的挑战。煤矿安全意识警示教育与防治实训室的建设,正是以新一代信息…...

06|AI 参与开发的安全底线:别把密钥和隐私喂进去

本篇目标:这是“卷 0”的最后一篇。在正式开始写代码前,我们必须立下“生死状”。遵守这些规则,能让你免于牢狱之灾或破产风险。一、血淋淋的教训 在你觉得“我只是个小透明,黑客不会搞我”之前,先看两个真实案例&…...

网络安全学习路线:2026年最新技术趋势与系统化成长路径

【值得收藏】网络安全学习路线:2026年最新技术趋势与系统化成长路径 这篇文章为网络安全学习者提供了一条系统化的六阶段学习路径,从基础准备到专业深耕。文章介绍了三大发展方向、2026年新趋势与热点,并提供科学学习方法和职业发展建议。强…...

书单号视频搬运软件推荐8款(2026实测版)

书单号视频搬运软件推荐(2026实测版) 做书单号搬运/二剪,核心要抓去重过原创、批量效率、配音字幕三点,以下按“新手易上手→专业高效率→专用工具”分级推荐,附适用场景与关键技巧。 一、新手首选(手机端&…...

企业培训ROI怎么算?这套可直接套用的量化表,让效果看得见

做企业培训的人,几乎都遇过这样的灵魂拷问:“花了十几万做培训,到底给公司带来了什么?”“课上大家听得很认真,怎么业绩没见涨?”“明年培训预算要砍30%,你拿什么证明这笔钱花得值?”…...

库克推最便宜MacBook,为啥还是会被骂?

这些年,苹果的产品可以说是价格越来越高,面对着高价的诟病,苹果终于下定决心推出廉价产品,这就是最新款的MacBook,然而就是这一款平价产品却反而遭到了消费者的诟病,这到底是怎么回事?一、库克推…...

洛谷 P1455 搭配购买

题目描述明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有 n 朵云,云朵已经被老板编…...

2026 年上海本地靠谱财税公司榜单,服务口碑双在线

2026年,上海本地财税公司逐渐增多,服务质量和口碑备受关注。本文将盘点几家凭借专业服务和良好信誉脱颖而出的财税公司。这些公司在财税筹划、账务处理等领域表现突出,客户普遍评价其响应速度快、服务透明,成为企业发展的得力助手…...

新建虚拟机

新建虚拟机1、2、3、4、5、6、7、8、改虚拟机配置9、10、11、12、改为自己的光驱确定即可,然后开启虚拟机14、15、16、安装位置,已选择自动分区,点击“完成”即可17、软件选择,选“GNOME”桌面,点击“完成”18、命名完…...

苹果新款笔记本电脑发布:性能升级与市场定位调整

新款 MacBook 处理器升级亮点多 新款 MacBook Pro 搭载的 M5 Pro 和 M5 Max 处理器备受瞩目,不仅让苹果最快的笔记本电脑处理器速度显著提升,其内部还进行了重大改进。这两款处理器的升级,无疑为 MacBook Pro 带来了更强大的性能表现&#xf…...

基于 NXP iMX8MP ARM平台安装测试 Openclaw

By Toradex秦海 1). 简介 Openclaw AI agent 开源项目最新非常火热,目前主流是基于 Mac 或者 X68 PC 进行安装部署,本文就尝试基于 NXP iMX8MP ARM 平台通过 Docker 环境进行部署测试。另外,通过 Docker 部署的好处除了可复用性&#xff0c…...

安心部署 OpenClaw,数美科技智能体安全防护方案来了!

近期,开源AI智能体OpenClaw爆火,在GitHub上短短几周便成为有史以来最受欢迎的开源项目,引领AI正式迈入“Agent时代”。这股狂潮在中国市场引发了前所未有的部署热,不仅腾讯云、百度等大厂纷纷下场提供部署服务,各地方政…...

MFC CDialog触摸屏长按不响应右键消息解决方案

方案1 重写虚函数GetGestureStatus,返回0即可。方案2 响应WM_TABLET_QUERYSYSTEMGESTURESTATUS消息,返回0即可。方案3 用vs2010之前的版本编译,vs2010开始默认CWnd类出于性能原因返回TABLET_DISABLE_PRESSANDHOLD。注意:如果子窗口…...

在 Linux 上通过命令行上架 iOS APP,Fastlane + AppUploader(开心上架)

很多团队的 CI 或发布环境运行在 Linux 服务器上,例如 GitLab Runner、Jenkins 或自建构建节点。当应用已经生成 .ipa 文件之后,接下来就是是否可以在 Linux 上直接把 IPA 上传到 App Store? 答案是可以的,关键在于把流程分开&…...

【转行必看】程序员从零转行大模型全攻略:从入门到职业落地无坑指南

人工智能浪潮下,大模型技术的爆发彻底重塑了科技行业的人才需求版图。以GPT、BERT、LLaMA为代表的主流大模型,不仅在自然语言处理、计算机视觉等核心领域实现颠覆性突破,更催生出一大批高薪岗位。 对普通程序员而言,转行大模型绝…...

搅拌功率计算避坑指南:挡板设置对永田公式影响的7个关键点

搅拌功率计算避坑指南:挡板设置对永田公式影响的7个关键点 在搅拌工艺的研发与优化中,功率计算是绕不开的核心环节。许多工程师都熟悉永田进治公式,它结构清晰,是估算搅拌功率的经典起点。然而,公式本身只是一个数学模…...

ChatGPT Prompt Engineering实战:开发者代码运行环境全解析

背景痛点:你的代码究竟在哪儿跑? 最近在折腾ChatGPT的Prompt Engineering,我发现很多开发者朋友,包括我自己一开始,都踩过一个坑:搞不清Prompt处理代码到底在哪里执行。 这听起来像是个低级问题&#xff…...

C++三种参数传递方式:从交换函数看值、指针与引用的区别

本篇文章将通过一个简单的交换函数示例&#xff0c;详细介绍C中的三种参数传递方式&#xff1a;值传递、指针传递和引用传递。我们会分析每种方式的特点以及它们在函数调用中对实参的影响。代码预览#include <iostream> using namespace std;// 1. 值传递 void Swap01(in…...

NX二次开发C#-----NXopen测量两个面的投影距离

该代码实现了一个计算两个面之间投影距离的方法。通过创建工作部件中的测量距离构建器&#xff0c;设置投影方向为指定向量&#xff0c;并指定两个测量面对象。使用最小投影距离算法创建测量对象&#xff0c;最终返回两个面之间的投影距离值。计算完成后销毁测量构建器以释放资…...

Linux下HYM8563 RTC驱动加载失败的5种排查姿势(附i2cdetect实战)

Linux下RTC驱动加载失败&#xff1a;从硬件到内核的深度排查实战指南 最近在调试一块嵌入式板卡时&#xff0c;遇到了一个典型的RTC驱动加载问题&#xff1a;系统启动时HYM8563 RTC芯片驱动加载失败&#xff0c;但重启后却能正常工作。这种“开机失败、重启正常”的现象在嵌入式…...

【图像隐藏】基于分数随机小波变换和密码分析的图像隐写术附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

整合物联网、大数据、人工智能等技术的Java智慧工地项目管理系统源码

系统功能1、项目人员管理项目管理&#xff1a;项目名称、施工单位名称、项目地址、项目地址、总造价、总面积、施工准可证、开工日期、计划竣工日期、项目状态等。人员信息管理&#xff1a;支持身份证及人脸信息采集&#xff1b;基础信息、证书信息、合同信息、培训信息等多项数…...

Qt 实现三维坐标系的方法

使用 Qt 实现三维坐标系通常需要结合 Qt 3D 模块或第三方库&#xff08;如 OpenGL&#xff09;。以下是几种常见方法&#xff1a;使用 Qt 3D 模块Qt 3D 提供了完整的 3D 渲染框架&#xff0c;适合创建交互式 3D 应用。以下是基本实现步骤&#xff1a;#include <Qt3DCore/QEn…...

mcp-server-chart的跨域问题

mcp-server-chart本地源码部署完成后&#xff0c;SSE模式启动 mcp-server-chart --transport sse --host 0.0.0.0后&#xff0c;可以访问http://localhost:1122/sse&#xff0c;一直显示不出来tools,F12进行调试显示CORS跨域错误。对sse.ts进行了更改。import type { Server } …...

从本地到云端:若依前后端分离项目部署全流程(附跨域配置与宝塔面板实战)

从本地到云端&#xff1a;若依前后端分离项目部署全流程&#xff08;附跨域配置与宝塔面板实战&#xff09; 最近和几个技术团队的朋友聊天&#xff0c;发现不少人在做项目交付时&#xff0c;总在部署环节卡壳。尤其是像若依这类功能完善但结构相对复杂的开源框架&#xff0c;从…...