JMeter变量作用域详解:从本地变量到全局属性的跨线程组参数传递实战
1. 项目概述从一次参数传递的“事故”说起前几天我团队里一个刚接触Jmeter不久的小伙伴跑来求助他写了一个模拟用户登录后查询订单的压测脚本结果跑出来的数据完全不对。登录是成功了但后续的订单查询请求里用户ID总是错的要么是空值要么是上一个线程的数据。他一脸困惑地问我“老师我明明在登录请求后用正则提取器把userId存到变量里了为什么后面的请求就是拿不到呢” 我一看他的脚本结构就明白了——他把登录和查询放在了两个不同的线程组里然后在第一个线程组里用了一个User Defined Variables元件来存储userId以为这样就能全局通用了。这其实是一个在Jmeter性能测试和接口测试中非常经典且高频的“坑”跨HTTP请求的参数传递问题核心矛盾点就在于对本地变量线程局部变量和全局变量属性的理解混淆。简单来说Jmeter里变量的作用域直接决定了你的参数能不能“跑”对地方。如果把一次完整的业务流比如登录-浏览-下单比作一场接力赛那么每个虚拟用户线程就是一名运动员他手里的接力棒变量只能自己拿着跑完全程线程内有效。而如果你想在所有运动员之间共享一瓶水全局配置那就需要把它放在跑道边的公共补给站属性里。我小伙伴的错误就是试图让运动员A的接力棒直接飞到运动员B的手里这显然违反了规则。这篇文章我就结合自己这些年做接口自动化、性能压测踩过的无数个坑把Jmeter中变量传递那点事儿彻底掰扯清楚。无论你是正在学习Jmeter接口测试教程的新手还是被jmeter报错java.net.BindException: Address already in use之类问题困扰的进阶用户理解清楚变量作用域都能让你的脚本稳定性提升一个档次。我们会深入对比本地变量如${var}和全局变量如${__P(property)}或${__property(property)}的使用场景、设置方法、生命周期并通过一个完整的“用户登录并查询个人信息”的案例手把手带你实现跨线程组、甚至跨测试计划的参数传递。最后还会分享几个实战中总结的“避坑指南”比如如何用JSR223 Sampler动态处理变量以及遇到“报错access to was blocked by ssrf protection”这类问题时如何检查你的参数传递链路。2. 核心概念拆解线程、变量与属性的三角关系要彻底弄懂参数传递必须先理解Jmeter脚本执行时的三个核心概念线程Thread、变量Variable和属性Property。它们之间的关系构成了Jmeter参数传递的所有规则基础。2.1 线程Thread与线程组Thread Group执行的基本单元在Jmeter中每一个虚拟用户对应一个独立的线程。线程组则是这些线程的容器用于定义并发用户数线程数、循环次数、启动时间等。这是理解变量作用域最关键的一点默认情况下变量是绑定在线程上的。线程隔离每个线程都有自己独立的变量副本。线程A中定义的变量token_A线程B是完全看不见、也访问不到的。这保证了模拟多用户并发时数据不会相互串扰是性能测试的基础。线程组隔离不同的线程组意味着不同的线程集合。即使你在“线程组A”里定义了一个变量在“线程组B”的线程中这个变量也是不存在的。这就是我同事遇到问题的根源。注意这里有个常见的误解认为“线程组”是比“线程”更大的作用域。其实不然线程组只是一个管理单元并不提供额外的变量共享空间。变量共享的最小单位是线程最大单位通过特定方法可以是整个JVM实例。2.2 本地变量Local Variables线程的“私房钱”本地变量也叫线程局部变量是Jmeter中最常用、最直接的变量形式。我们通过后置处理器如正则表达式提取器、JSON提取器或用户定义的变量元件创建的变量默认都是本地变量。特性作用域仅限于定义它的单个线程的生命周期内。生命周期从被定义开始到该线程运行结束为止。访问方式直接通过${variableName}格式引用。典型创建方式后置处理器如“正则表达式提取器”从服务器响应中提取值并存入变量。用户定义的变量User Defined Variables在测试计划或线程组级别预定义变量和初始值。重要即使在线程组级别添加该元件它定义的变量依然是每个线程的本地变量只是初始值相同。CSV Data Set Config从文件读取数据每行数据会赋值给指定的变量每个线程独立迭代。示例场景你用正则表达式从一个登录响应中提取了sessionId并保存到变量auth_token中。在同一线程内后续的“查询用户信息”请求的Header中就可以直接使用${auth_token}。但对于其他并发线程它们各自有自己提取的auth_token互不干扰。2.3 全局变量PropertiesJVM的“公共黑板”Jmeter中真正的“全局”概念是通过属性Properties实现的。属性是JVM级别的键值对在整个Jmeter进程即一个测试计划运行实例中都有效。特性作用域全局。对所有线程组、所有线程都可见。生命周期从被设置开始到整个Jmeter进程结束。甚至可以通过命令行参数或jmeter.properties文件在启动时注入。访问方式需要使用特定的函数来读写。读取属性${__P(propertyName, defaultValue)}或${__property(propertyName)}设置属性通常通过__setProperty函数或在“BeanShell Sampler/JSR223 Sampler”中写代码设置。典型创建方式函数助手使用__setProperty函数。JSR223 Sampler用Groovy或Java代码设置如props.put(global_user, admin)。命令行参数启动Jmeter时通过-J传递如-Jserver.hostapi.example.com。jmeter.properties文件永久性配置。示例场景你需要压测一个集群所有线程都需要知道同一个网关地址。你可以通过命令行jmeter -Jgateway.urlhttp://192.168.1.100:8080 -n -t test.jmx -l result.jtl启动测试然后在脚本中任何地方用${__P(gateway.url)}来引用这个地址。修改时只需改命令行参数无需修改脚本。2.4 本地变量 vs 全局变量一张表看懂区别为了更直观我把核心区别整理成了下表特性维度本地变量 (Local Variable)全局变量/属性 (Property)作用域线程级。仅定义它的线程内有效。JVM/进程级。所有线程组、所有线程共享。生命周期随线程而生随线程而灭。随Jmeter进程而生而灭或通过代码持久化。定义方式正则提取器、JSON提取器、用户定义变量、CSV数据集等。__setProperty函数、JSR223代码、命令行参数-J、jmeter.properties文件。引用方式${varName}${__P(propName)}或${__property(propName)}线程安全天然线程安全因为数据隔离。非线程安全。多个线程同时读写同一属性需谨慎通常用于只读场景。典型用途存储用户会话信息token、userId、单次请求的响应提取值。存储全局配置服务器地址、端口、压测总时长、需要跨线程组传递的基准ID。性能影响几乎无额外开销。读写属性涉及函数调用或代码执行比本地变量稍慢但通常可忽略。理解了这个根本区别我们就能针对不同的测试场景选择正确的参数传递策略了。3. 实战演练跨线程组传递用户Token现在我们用一个贴近实际业务的例子来串联上述概念。场景是线程组A模拟用户登录并获取Token线程组B模拟使用这个Token去查询用户详情。这是一个典型的“数据准备”与“业务压测”分离的场景常用于需要先批量构造数据如注册用户再用另一批线程进行主要业务压测的情况。3.1 方案设计为什么选择属性Property首先分析需求Token需要从线程组A传递到线程组B。根据上一章的结论线程组间的本地变量是隔离的因此必须使用属性作为传递媒介。但这里有一个关键问题Jmeter的线程组默认是并行执行的。如果线程组B在A还没获取到Token时就开始运行它读取到的属性将是空或默认值。因此我们需要确保执行顺序。有两种主流方案使用“仅一次控制器”和“同步定时器”将登录请求放在“仅一次控制器”内并配合同步定时器确保所有线程在登录完成后才进行下一步。但这通常用于同一线程组内。使用“Test Action”或“模块控制器”控制流程比较复杂。最佳实践利用线程组的“调度器”和“启动延迟”这是跨线程组传递最清晰的方式。我们将线程组A设置为先执行并在其中将Token设置为属性。线程组B延迟启动确保启动时属性已就绪。我们采用第三种方案。同时为了模拟真实并发我们让线程组A有多个线程模拟多个用户登录并将每个线程获取的Token都设置到属性中后一个会覆盖前一个。线程组B则读取这个统一的Token进行查询。这在压测“同一个热点用户”的场景下是合理的。如果需要每个线程使用自己的Token则需要更复杂的映射关系例如用属性存储一个Token列表然后各线程按索引取这通常用JSR223编码实现。3.2 步骤详解从登录到查询的完整链路步骤1创建测试计划与线程组新建一个测试计划。添加第一个线程组重命名为01-用户登录组。线程数5模拟5个用户登录但最终我们只取最后一个Token用于全局传递演示目的。循环次数1。其他保持默认。添加第二个线程组重命名为02-查询用户组。线程数10。循环次数5。调度器勾选。启动延迟设置为5秒。这是关键确保登录组有足够时间运行并设置属性。步骤2配置01-用户登录组在该线程组下添加一个HTTP请求命名为登录请求。协议http服务器名称或IPapi.demo.com(请替换为你的测试地址)端口8080HTTP请求POST路径/auth/login在Body Data中填入登录参数例如{username: testUser, password: 123456}在登录请求下添加一个JSON提取器如果响应是JSON格式或正则表达式提取器命名为提取Token。JSON提取器配置Names of created variables:auth_token(这就是我们创建的本地变量)JSON Path expressions:$.data.token(根据实际响应体结构调整)Match No.:1正则表达式提取器配置备用引用名称auth_token正则表达式token:(.?)(根据实际响应体调整)模板$1$匹配数字1关键步骤将本地变量转为全局属性。在提取Token后添加一个JSR223 Sampler语言选择Groovy性能最好。将其命名为设置全局Token属性。在脚本区域写入// 获取当前线程提取到的本地变量 auth_token 的值 String tokenValue vars.get(auth_token); // 将 tokenValue 设置为一个全局属性命名为 GLOBAL_AUTH_TOKEN if (tokenValue ! null !tokenValue.isEmpty()) { props.put(GLOBAL_AUTH_TOKEN, tokenValue); log.info(已将Token设置为全局属性: tokenValue); } else { log.warn(提取到的Token为空未设置全局属性。); }代码解释vars是Jmeter提供的JMeterVariables对象用于操作线程本地变量。vars.get(“变量名”)用于取值。props是Jmeter提供的Properties对象用于操作全局属性。props.put(“属性名”, “值”)用于设置属性。这里每个登录线程都会执行一次所以GLOBAL_AUTH_TOKEN属性的值会被最后一个执行的线程覆盖。对于演示“传递一个Token”的场景这没问题。步骤3配置02-查询用户组在该线程组下添加一个HTTP请求命名为查询用户详情。协议http服务器名称或IPapi.demo.com端口8080HTTP请求GET路径/user/profile添加一个HTTP信息头管理器关联到查询用户详情请求。添加一个头名称Authorization值Bearer ${__P(GLOBAL_AUTH_TOKEN,)}【核心】这里使用__P函数读取全局属性。__P函数的第二个参数是默认值这里留空表示如果属性不存在则为空字符串。步骤4添加监听器与运行在测试计划层级添加查看结果树和聚合报告监听器便于调试和查看结果。运行测试计划。观察与验证在查看结果树中先查看01-用户登录组的请求。确保登录成功并且JSR223 Sampler的日志显示成功设置了属性。查看02-查询用户组的请求。检查其请求头中的Authorization字段是否正确地携带了Token。如果Token有效查询请求应该返回成功的响应如200 OK和用户信息。实操心得在设置启动延迟时时间不宜过短。如果登录接口响应慢或线程组A有其他预处理5秒可能不够。一个更稳健的做法是在线程组B的第一个请求前添加一个While Controller和JSR223 Sampler进行轮询直到检测到属性被成功设置后再执行后续请求。代码片段如下int maxWait 30000; // 最大等待30秒 int interval 500; // 每次检查间隔500毫秒 long startTime System.currentTimeMillis(); while (props.get(GLOBAL_AUTH_TOKEN) null) { if (System.currentTimeMillis() - startTime maxWait) { log.error(等待全局Token超时); SampleResult.setStopTestNow(true); // 可选停止测试 break; } Thread.sleep(interval); } log.info(检测到全局Token开始执行查询。);4. 高级技巧与避坑指南掌握了基础传递方法后我们来看看一些更复杂的场景和那些容易让人“掉坑”的地方。4.1 使用__setProperty函数进行动态设置除了用JSR223代码还可以使用内置函数__setProperty来设置属性。你可以在任何Sampler或配置元件的参数值中使用它。方法在登录请求成功后添加一个BeanShell PostProcessor或继续使用JSR223 PostProcessor在其脚本框中写入${__setProperty(GLOBAL_USER_ID, ${extracted_userId}, true)}第一个参数属性名。第二个参数属性值。这里可以直接引用之前提取的本地变量${extracted_userId}。第三个参数true表示将属性回写到jmeter.properties文件不常用通常设为false或留空。优缺点优点无需写代码对于简单赋值更快捷。缺点函数执行是同步的且调试不如JSR223灵活。在复杂的逻辑判断或数据处理场景下JSR223是更优选择。4.2 处理“报错access to was blocked by ssrf protection”这个错误信息通常出现在你的请求URL参数或路径中包含了一个空的或格式错误的变量。在跨请求传递参数时极易发生。根本原因下游服务或网关的安全策略SSRF保护检测到请求中包含了可能用于内网探测的空主机名、非法IP或URL。在Jmeter中的诱因变量未定义或为空当你使用${undefined_var}作为URL的一部分时如果该变量未被成功提取比如正则表达式没匹配到Jmeter会将其替换为空字符串。这可能导致最终请求的URL变成http://api.com/user/${userId}-http://api.com/user/或者更糟http:///path。属性读取失败使用${__P(some_prop)}时如果该属性不存在且未设默认值也会导致空值。排查与解决检查前置提取器在查看结果树中确认生成源变量的请求如登录请求是否成功以及后置处理器正则/JSON提取器是否正确地提取到了值。检查引用名称是否正确。添加默认值在引用变量时使用Jmeter的默认值语法${varName:-defaultValue}。例如${userId:-0}当userId为空时会使用0。对于属性使用${__P(propName, N/A)}。使用调试Sampler在关键位置添加Debug Sampler和View Results Tree查看JMeterVariables和JMeterProperties确认变量和属性的值是否符合预期。URL编码如果传递的参数值本身包含特殊字符如,?,/可能需要在HTTP请求中勾选“编码”选项或者使用__urlencode函数处理。4.3 跨测试计划传递参数使用-J命令行参数有时我们需要将一个参数如环境配置传递给多个独立的测试计划.jmx文件。这时-J命令行参数就派上用场了。操作在启动Jmeter时使用-Jproperty_nameproperty_value格式。jmeter -Japi.hoststaging.example.com -Jthread.count50 -n -t /path/to/your_test.jmx -l result.jtl在脚本中引用在测试计划的任何地方都可以通过${__P(api.host)}和${__P(thread.count)}来引用这些属性。应用场景区分测试环境开发、测试、生产、动态调整压测规模而无需修改脚本本身。这对于CI/CD集成非常有用。4.4 性能考量变量与属性的访问开销在超高并发例如数千线程的压测场景下每一个微小的开销都需要考虑。本地变量访问速度极快因为它本质上是线程栈内的哈希表查找。属性全局变量访问${__P(...)}涉及函数调用和全局属性表的查找开销比本地变量大。${__property(...)}函数类似。建议频繁访问的数据如每个请求都要用的userId、token应优先存储为本地变量。如果需要在同线程内跨请求传递这是唯一选择。只读的全局配置如服务器地址、端口、全局开关使用属性。它们只在脚本初始化或少量位置被读取性能影响可忽略不计。避免在循环中频繁读写属性如果业务逻辑要求每个线程在循环中不断更新一个全局计数器使用属性可能会成为瓶颈。此时应考虑使用JSR223配合原子类如java.util.concurrent.atomic.AtomicInteger或使用专门的Counter配置元件。5. 常见问题排查与调试技巧实录即使理解了原理在实际操作中还是会遇到各种稀奇古怪的问题。下面是我总结的一些常见问题及其排查思路附上现场调试方法。5.1 问题速查表问题现象可能原因排查步骤与解决方案变量值为空${var}显示为空白1. 前置提取器未成功匹配数据。2. 变量名拼写错误。3. 作用域错误跨线程组引用本地变量。4. 变量在引用后才被定义。1. 在查看结果树中检查提取器所在请求的响应数据确认目标内容存在。2. 检查提取器的“引用名称”与引用处是否完全一致大小写敏感。3. 使用Debug Sampler查看当前线程的所有变量(JMeterVariables)。4. 调整Sampler和提取器的顺序确保先定义后引用。属性读取失败${__P(...)}无效1. 属性未被成功设置。2. 属性名拼写错误。3. 线程组执行顺序问题读取时属性尚未设置。1. 在设置属性的元件后添加Debug Sampler查看JMeterProperties。2. 确认__P函数中的属性名与设置时一致。3. 确保读取属性的线程组在设置属性的线程组之后执行用调度器延迟或Test Action控制。“报错java.net.BindException: Address already in use”1. 短时间内产生大量TCP连接操作系统端口被耗尽或处于TIME_WAIT状态。2. Jmeter自身配置问题。此问题与变量传递无直接关系但常在高并发压测时遇到。1. 在HTTP请求默认值或具体请求中勾选“Use KeepAlive”。2. 在jmeter.properties中调整httpclient4.time_to_live连接存活时间和httpclient4.max_total_connections。3. 优化脚本减少不必要的连接建立。跨线程组数据串扰错误地使用了本地变量以为可以跨线程组共享。明确需求如果数据需要跨线程组共享必须使用属性或通过外部文件如CSV中转。性能测试结果不稳定部分请求失败1. 属性读写竞争多个线程同时写一个属性。2. 资源未正确释放如数据库连接。3. 参数化数据量不足导致迭代后期数据重复或冲突。1. 全局属性尽量用于只读场景。如需全局计数使用JSR223原子类。2. 检查是否有后置逻辑如JDBC连接需要清理。3. 检查CSV数据集或参数化文件的配置确保数据量大于线程数*循环次数并合理设置“遇到文件结束符...”的行为。5.2 调试利器Debug Sampler 与 View Results Tree在排查变量和属性问题时这两个监听器是你的最佳伙伴。添加Debug Sampler在你怀疑有问题的地方比如设置属性后、使用变量前右键添加 - Sampler - Debug Sampler。它本身不会发送HTTP请求但会收集当前JVM上下文的信息。配置View Results Tree确保添加了查看结果树监听器。运行并分析运行脚本后在查看结果树中找到Debug Sampler的样本结果。查看JMeterVariables这里列出了当前线程的所有本地变量及其值。这是检查变量是否被成功创建和赋值的直接证据。查看JMeterProperties这里列出了所有的全局属性及其值。这是检查属性是否被成功设置的关键。查看System Properties通常与本次问题关系不大。通过对比Debug Sampler在流程不同节点输出的信息你可以清晰地追踪到变量和属性的生命周期与值的变化从而快速定位问题根源。5.3 关于“用户定义的变量”元件的深刻理解这是一个极易产生误解的元件。很多人包括我开头提到的同事认为在线程组下添加User Defined Variables里面定义的变量就是该线程组全局的。这是错误的。真相User Defined Variables元件定义的变量依然是线程级的本地变量。它的特殊之处在于它在测试计划或线程组初始化时为每一个线程都创建一份相同的初始值副本。后果线程A修改了该变量的值不会影响线程B的副本。它无法用于线程间的实时通信。正确用途定义一些常量或初始值例如服务器地址前缀、默认超时时间等。这些值在测试过程中通常不会被线程修改或者即使修改也不影响其他线程。如果你需要一个所有线程共享且可修改的“全局变量”请毫不犹豫地选择使用属性。变量和属性的传递是Jmeter脚本从“能用”到“稳定、高效”的关键一步。它直接关系到脚本能否真实模拟复杂的业务场景以及性能测试结果是否准确可靠。理解并熟练运用本地变量与全局属性就如同掌握了Jmeter脚本的“任督二脉”。下次当你再遇到参数传递不灵的时候不妨先问自己一句这个数据到底应该是线程的“私房钱”还是JVM的“公共黑板”想清楚了这个问题很多难题就迎刃而解了。

相关新闻

AI办公自动化实战:从WorkBuddy与Codex部署到数字员工开发全流程

AI办公自动化实战:从WorkBuddy与Codex部署到数字员工开发全流程

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度 1. 先搞清楚 WorkBuddy 和 Codex 到底是什么,以及这个训练营能解决什么问题 如果你正在找能帮你自动处理办公任务的工具…

2026/7/4 17:25:01 阅读更多 →
机器学习模型服务化实战:从Notebook到K8s生产部署

机器学习模型服务化实战:从Notebook到K8s生产部署

1. 项目概述:当模型走出Jupyter,真正开始呼吸真实世界空气“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题里藏着一个被无数数据科学家反复咀嚼、又悄悄咽下的苦涩真相:我们花了80%的时间调参、画图、在…

2026/7/4 17:23:00 阅读更多 →
5分钟部署OpenAI兼容API服务器:LMDeploy实战指南

5分钟部署OpenAI兼容API服务器:LMDeploy实战指南

1. 项目概述:为什么你需要一个自己的OpenChat API服务器? 最近在折腾AI应用开发的朋友,估计都遇到过同一个头疼的问题:调用OpenAI的官方API,要么是网络不稳定,要么是费用蹭蹭往上涨,要么就是某些…

2026/7/4 17:23:00 阅读更多 →

最新新闻

基于YOLOv3的智能口罩检测系统设计与实现

基于YOLOv3的智能口罩检测系统设计与实现

1. 项目概述与背景在公共卫生事件频发的当下,开发智能化的防疫辅助工具显得尤为重要。这个毕业设计项目基于YOLOv3目标检测算法,实现了一个能够自动检测口罩佩戴情况的系统。系统可以识别三种状态:正确佩戴口罩、未佩戴口罩以及口罩佩戴不规范…

2026/7/4 18:19:17 阅读更多 →
大模型数据准备实战:高信噪比语料构建七步法

大模型数据准备实战:高信噪比语料构建七步法

1. 为什么说“数据准备”才是训练定制大模型时最耗神、也最值钱的环节你有没有过这种体验:花两周时间调参、换架构、折腾分布式训练,最后发现模型在业务场景里答非所问,逻辑混乱,甚至编造事实?我带过三支不同行业的LLM…

2026/7/4 18:13:16 阅读更多 →
遗传算法优化大模型参数:自动化调参实战

遗传算法优化大模型参数:自动化调参实战

1. 项目概述:当遗传算法遇上大模型去年在优化一个客服对话系统时,我花了整整两周手工调整prompt模板和模型参数。直到某天深夜调试时突然想到:为什么不让算法自己寻找最优解?这就是GA(遗传算法)大模型组合的…

2026/7/4 18:11:15 阅读更多 →
机器学习新手必学的5大核心领域进阶地图

机器学习新手必学的5大核心领域进阶地图

1. 这不是一份“排行榜”,而是一张新手进阶地图:为什么初学者必须先搞懂这5个机器学习领域你点开这篇博客,大概率正站在机器学习的入口处——手头可能刚装好Python,跑通了第一个print("Hello, ML!"),但面对“…

2026/7/4 18:11:15 阅读更多 →
AI十年演进路径:从边缘智能到可信AI的工程化落地

AI十年演进路径:从边缘智能到可信AI的工程化落地

1. 这不是预言,而是技术演进路径的推演:我们真正该关注的AI十年图景你点开这篇文章,大概率不是为了听一句“AI会改变世界”——这句话从2012年AlexNet横空出世那天起,就被重复了上万遍。我做AI工程落地和系统架构设计整整11年&…

2026/7/4 18:07:14 阅读更多 →
Spring Boot + MyBatis + Vue 全栈毕设实战:从零到部署的完整项目开发指南

Spring Boot + MyBatis + Vue 全栈毕设实战:从零到部署的完整项目开发指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度 计算机专业的学生在完成毕业设计或课程设计时,常常面临一个核心矛盾:既要理解项目背后的技术原理&#xff0…

2026/7/4 18:07:14 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻