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

深入解析CAN总线字节序:Motorola与Intel格式的实战对比

1. 从一次数据解析“翻车”说起为什么字节序这么重要大家好我是老张在汽车电子和嵌入式领域摸爬滚打了十几年。今天想和大家聊聊一个看似基础但实际项目中坑了无数工程师的“小”问题——CAN总线的字节序。你可能觉得不就是Motorola和Intel两种格式嘛概念我都懂。但说实话我见过太多项目在联调阶段因为字节序没对齐导致仪表盘车速显示乱跳、车窗控制失灵甚至更严重的功能故障。问题往往就出在“我以为我懂了”的细节里。想象一下这个场景你负责的车身控制器BCM通过CAN总线收到了一个来自网关的16位车速信号报文数据是0x12 0x34。你的代码按照“常识”把它拼成了0x1234换算成十进制是4660。但实际车速应该是多少如果协议规定是Motorola格式那真实值应该是0x3412也就是13330。这误差可就大了去了。更头疼的是如果这个信号还跨越了不止两个字节或者起始位不在字节边界上那解析起来就更是一团乱麻。所以今天我们不谈枯燥的理论就从实战出发掰开揉碎了讲清楚Motorola大端和Intel小端这两种字节序到底有什么区别在代码里怎么处理以及如何避免那些常见的坑。无论你是刚入行的嵌入式软件工程师还是负责测试验证的同事相信这篇都能帮你把这块知识彻底夯实。2. 基础不牢地动山摇彻底搞懂位序与字节序在深入对比Motorola和Intel之前我们必须先把几个最核心的概念掰扯明白。很多混乱其实源于对基础概念理解得模棱两可。2.1 CAN总线的“物理现实”传输顺序首先我们得忘掉高级语言里的那些“变量”回到CAN总线的物理层。总线上跑的不是我们直接能读的“车速100”而是一连串高低电平也就是“位”bit。这些位组成字节字节再组成一帧报文。对于一帧经典的8字节CAN数据帧它的数据传输顺序是严格规定的字节顺序从Byte 0开始传输最后传输Byte 7。你可以把Byte 0想象成先上车的乘客。字节内位顺序在每个字节内部从最高位MSB, bit 7开始传输最后传输最低位LSB, bit 0。这个顺序是CAN总线协议物理层规定的全球通用没人能改。我们可以用一个简单的表格来可视化这个传输过程传输顺序从先到后字节位从高到低1 - 8Byte 0bit7, bit6, bit5, bit4, bit3, bit2, bit1, bit09 - 16Byte 1bit15, bit14, ..., bit8.........57 - 64Byte 7bit63, bit62, ..., bit56这个顺序就像我们看书从左到右读完一行一个字节再换到下一行。这个“行”的顺序和“字”的顺序是固定的。2.2 核心矛盾存储顺序 vs. 传输顺序好了物理层的事说完了。现在问题来了当这一串0和1的电平信号经过CAN控制器变成数字量存放到我们单片机的内存里时该怎么放这就引出了“字节序”和“位序”的概念。它们描述的是数据在存储介质如内存中的排列方式而不是在总线上的传输方式。字节序一个多字节数据比如16位的整数在内存中它的高字节和低字节分别放在什么地址。位序一个字节内部它的最高位和最低位在内存中对应的比特位置。而“大端”和“小端”就是描述这两种“序”的模式。大端模式高字节存在低地址高位在一个字节内存在低位地址。这比较符合人类的阅读习惯就像我们写数字“一百二十三”百位高位在左边。小端模式低字节存在低地址低位在一个字节内存在低位地址。这更像是我们做加法从个位低位开始操作。对于CAN总线协议已经强制规定位序必须是大端模式。也就是说在一个字节的存储空间里bit7MSB对应内存的最低比特位。这一点没有商量余地所以我们在讨论CAN时通常不单独提“位序”因为它已经固定了。真正的变数也是我们今天讨论的重点在于字节序。这就是Motorola和Intel格式登场的舞台。3. 实战拆解Motorola格式 vs. Intel格式现在让我们把目光聚焦到字节序也就是Motorola和Intel的核心区别上。一句话概括Motorola格式 大端字节序Intel格式 小端字节序这个命名的历史渊源是早期Motorola的处理器如68000系列使用大端而Intel的处理器如x86系列使用小端。名字就这么沿用了下来。3.1 生活化类比如何理解两种格式让我们用一个更生活化的例子来理解。假设你要通过快递寄送一个四位数“1234”给朋友这个数字由两个“字节”12和34组成。Motorola大端思维你认为最重要的部分是“千位和百位”12。所以你把“12”这个盒子放在快递箱的最外面低地址先被看到和处理把“34”这个盒子压在最里面高地址。你朋友拆箱时先看到“12”后看到“34”他按顺序读就是“1234”。Intel小端思维你认为从个位开始处理更方便。所以你把“34”这个盒子放在快递箱的最外面低地址把“12”这个盒子压在最里面高地址。你朋友拆箱时先看到“34”后看到“12”他必须把顺序反过来读才能得到正确的“1234”。在CAN信号解析里这个“快递箱”就是CAN数据帧的8字节数据域。“最外面”对应着先传输的Byte 0低地址“最里面”对应着后传输的Byte 7高地址。3.2 关键结论何时需要关心字节序这里有一个极其重要的结论也是很多新手容易混淆的地方只有当信号的长度超过8个比特也就是跨越了字节边界时Motorola和Intel格式的解析结果才会不同。如果一个信号只占一个字节比如一个8位的状态码那么无论你用Motorola还是Intel去解析结果都是一样的因为不存在字节之间的顺序问题。麻烦就出在那些跨字节的信号上比如16位的车速、32位的累计里程、12位的电池电压可能跨两个字节等等。下面我们用一个具体的16位信号来实战演练。4. 血泪案例一个16位车速信号解析的两种结局假设我们有一个CAN报文它的Byte 0和Byte 1共同携带了一个16位的车速信号。总线上传来的原始数据是Byte 0 0x12Byte 1 0x34发送端想要表达的车速值是0x1234十进制4660。4.1 场景一接收端使用Intel格式小端如果你的DBC文件或协议文档规定这个信号是Intel格式那么你的解析程序应该按小端模式来理解。内存/缓冲区视图你的程序会认为先收到的Byte 0(0x12) 是数据的低字节后收到的Byte 1(0x34) 是数据的高字节。组合方式为了还原发送端的原始值你需要把后收到的高字节放在前面先收到的低字节放在后面。即Value (Byte1 8) | Byte0。计算结果Value (0x34 8) | 0x12 0x3412十进制13330。糟糕解析出的车速是13330这显然不对。问题出在哪出在发送端如果也是按Intel格式发送的那么它放入Byte 0的应该是0x34低字节放入Byte 1的应该是0x12高字节。但我们的例子中发送端想发0x1234这暗示它可能用的是Motorola格式。看不对齐就出错了。4.2 场景二接收端使用Motorola格式大端如果你的解析是按照Motorola格式进行的内存/缓冲区视图你的程序会认为先收到的Byte 0(0x12) 就是数据的高字节后收到的Byte 1(0x34) 就是数据的低字节。组合方式直接按接收顺序组合即可。即Value (Byte0 8) | Byte1。计算结果Value (0x12 8) | 0x34 0x1234十进制4660。Bingo解析正确。这个简单的例子清晰地展示了对于同一个数据0x12, 0x34采用不同的字节序会得到完全不同的结果。在实际项目中DBC文件里每个信号都会明确指定其Byte Order是Motorola还是Intel。解析工具如CANoe、PCAN-View或你自己的解析代码必须严格按照这个规定来执行。5. 进阶难题信号起始位不在字节边界怎么办上面的例子比较理想信号正好从Byte 0的 bit 7 开始。但现实中为了充分利用8字节的数据域信号经常被“见缝插针”地放置。比如一个12位的信号可能从Byte 1的 bit 4 开始一直占据到Byte 2的 bit 7。这就带来了更复杂的位操作。这时我们不仅要关心字节序还要结合固定的大端位序来定位每一个比特。无论是Motorola还是Intel格式在CAN的语境下一个字节内部的bit顺序都是固定的bit7是最高位MSBbit0是最低位LSB。5.1 Motorola格式大端的填充规则对于Motorola格式信号的最高位MSB放在起始位。然后在字节内向bit0方向低位填充。当填满当前字节后向更高地址的字节序号更大的字节的bit7位置继续填充。 你可以把它想象成写字从一行的某个位置开始向右写字节内向低位写满一行就换到下一行的最左边下一字节的最高位继续写。举个例子一个12位信号0xABC二进制1010 1011 1100起始位在Byte 1的 bit 4。首先信号的最高位10xABC的bit11放在起始位Byte1[4]。在Byte 1内继续填充Byte1[3]0,Byte1[2]1,Byte1[1]0,Byte1[0]1。此时Byte 1的 bit4-bit0 被占用。Byte 1的 bit0 用完了换到Byte 2。注意换到Byte 2的最高位Byte2[7]继续填充。在Byte 2中填充剩余的位Byte2[7]1,Byte2[6]0,Byte2[5]1,Byte2[4]1,Byte2[3]1,Byte2[2]1,Byte2[1]0,Byte2[0]0。最终这个信号分散在Byte1[4:0]和Byte2[7:0]中。在总线上Byte 1先传输Byte 2后传输。5.2 Intel格式小端的填充规则对于Intel格式信号的最低位LSB放在起始位。然后在字节内向bit7方向高位填充。当填满当前字节后向更高地址的字节序号更大的字节的bit0位置继续填充。 这像是反着写字从一行的某个位置开始向左写字节内向高位写满一行就换到下一行的最右边下一字节的最低位继续写。用同一个例子12位信号0xABC起始位在Byte 1的 bit 4。首先信号的最低位00xABC的bit0放在起始位Byte1[4]。注意这里和Motorola完全不同在Byte 1内向高位填充Byte1[5]0,Byte1[6]1,Byte1[7]1。此时Byte 1的 bit4-bit7 被占用。Byte 1的 bit7 用完了换到Byte 2。换到Byte 2的最低位Byte2[0]继续填充。在Byte 2中填充剩余的位Byte2[0]1,Byte2[1]1,Byte2[2]1,Byte2[3]0,Byte2[4]1,Byte2[5]0,Byte2[6]1,Byte2[7]0。最终这个信号分散在Byte1[7:4]和Byte2[7:0]中。看到区别了吗同样的起始位置同样的信号值因为字节序不同它在两个字节中占据的具体比特位完全不同。5.3 如何在代码中实现通用解析手动去算这些位太容易出错。在实际开发中我们需要编写通用的解析函数。思路是先根据字节序和起始位计算出信号占据的所有比特在内存缓冲区中的位置然后将其提取并组合成一个整数。这里提供一个简化的C语言思路假设数据已存入uint8_t data[8]数组// 函数从CAN数据缓冲区中提取信号值 // data: CAN数据缓冲区data[0]为Byte0 // start_bit: 信号起始位0-63参照DBC中Sawtooth编号 // length: 信号长度比特数 // is_motorola: 是否为Motorola格式true: Motorola/大端, false: Intel/小端 uint64_t extract_signal(const uint8_t data[], int start_bit, int length, bool is_motorola) { uint64_t value 0; int current_bit start_bit; for (int i 0; i length; i) { int byte_index current_bit / 8; int bit_offset current_bit % 8; // 注意CAN总线字节内是MSB first即bit7是最高位 // 所以我们需要计算在字节内从MSB开始的偏移 int bit_in_byte 7 - bit_offset; // 将Sawtooth编号转换为字节内bit索引 // 读取当前比特 if ((data[byte_index] bit_in_byte) 0x01) { // 如果是Motorola先读到的位是信号的高位 // 如果是Intel先读到的位是信号的低位 if (is_motorola) { value (value 1) | 1; } else { value | (1ULL i); // 将比特放到正确位置 } } else { if (is_motorola) { value value 1; } // 对于Intel0值不需要特别操作因为初始化为0 } // 移动到下一个比特位 if (is_motorola) { // Motorola: 字节内向低位走跨字节时跳到下一字节的最高位 current_bit--; if (bit_offset 0) { // 当前字节的bit0用完 current_bit (byte_index 1) * 8 7; // 跳到下一字节的bit7 } } else { // Intel: 字节内向高位走跨字节时跳到下一字节的最低位 current_bit; if (bit_offset 7) { // 当前字节的bit7用完 current_bit (byte_index 1) * 8; // 跳到下一字节的bit0 } } } return value; }这段代码是一个概念演示实际使用中还需要考虑信号可能是有符号数、精度因子、偏移量等。但核心的位遍历逻辑已经体现。关键在于is_motorola这个标志它决定了我们遍历比特位的方向向前还是向后以及组合值的方式左移还是位或。6. DBC文件中的关键设置与工具使用心得理论懂了代码也会写了但日常工作中我们更多是使用现成工具。这里分享一下在Vector CANdb Editor最常用的DBC编辑工具中如何查看和设置字节序以及一些实用技巧。6.1 在CANdb中识别字节序打开一个DBC文件找到具体的信号查看其属性。你会看到Byte Order这一项下拉选项就是Motorola或Intel。同时Start Bit定义了信号的起始位置。这个起始位是采用“Sawtooth”编号的即从Byte0的bit7开始编号为0一直到Byte7的bit0编号为63。一个快速判断信号布局的技巧 在CANdb的Layout视图里你可以直观地看到信号在8x8的比特矩阵中是如何分布的。如果一个多字节信号的颜色块是从左到右连续延伸遇到字节边界就跳到下一行最左边那它很可能是Motorola格式。如果一个多字节信号的颜色块是从起始点向左延伸遇到字节边界就跳到下一行最右边那它很可能是Intel格式。6.2 Motorola的MSB和LSB变体细心的你可能会在有些文档或工具里看到Motorola MSB和Motorola LSB。这又是什么Motorola MSB这就是我们上面一直讨论的标准Motorola格式。起始位Start Bit指的是信号的最高位MSB。这是最常见的形式。Motorola LSB这是一种变体起始位Start Bit指的是信号的最低位LSB。信号的填充方向会发生变化。这种格式相对少见但某些旧的或特定的协议中可能会使用。核心区别就在于对“Start Bit”的定义不同。在解读DBC时一定要确认清楚使用的是哪一种。CANdb中通常直接叫Motorola默认为MSB变体。6.3 调试与验证避免“我以为”在实际项目中因为字节序导致的bug非常隐蔽。数据能收到解析也在跑但值就是不对。我的经验是交叉验证用CANoe、PCAN-View等专业工具和你自己写的解析程序同时对同一条报文进行解析对比结果。确保工具的数据库DBC配置和你的代码逻辑一致。打印原始数据在解析函数的最开始把8字节的原始数据以十六进制打印出来。这是最可靠的依据。单元测试为你的信号解析函数编写详尽的单元测试。构造各种边界用例单字节信号、跨两字节信号、跨多字节信号、起始位在奇怪位置的信号分别用Motorola和Intel格式验证。协议文档为王永远以最终正式的协议文档或DBC文件为准不要凭记忆或“惯例”。不同供应商、不同平台的习惯可能不同。7. 总结与个人踩坑经验聊了这么多最后分享几点我踩过坑之后的体会。首先不要混淆“网络传输顺序”和“内存字节序”。CAN总线的传输顺序先Byte0字节内先MSB是物理层固定的这是一个“流”。而Motorola/Intel字节序是应用层协议规定如何将这个“流”还原成有意义的数字。你可以把传输顺序想象成快递运输路线固定不变字节序则是发货人和收货人约定的拆箱组装说明书。其次对于任何跨字节的信号在编写解析代码或配置工具时第一个要问的问题就是“这个信号是Motorola还是Intel”养成这个条件反射能避免一大半的问题。第三善用可视化工具。像CANdb的Layout视图或者一些在线CAN信号解析器能非常直观地展示信号布局。对于复杂的信号画出来比空想管用得多。我记得早期做一个混动车辆的项目电机的扭矩信号是一个32位的Intel格式信号。我在测试时发现扭矩值偶尔会有巨大的跳变。排查了很久最后发现是供应商提供的DBC文件中这个信号的Byte Order标错了写成了Motorola。而我们和另一家控制器通信的同类型信号用的是Motorola工程师想当然地以为都一样没有逐个核对。就这么一个小疏忽导致了几天的调试时间。所以再简单的协议再熟悉的信号也请保持敬畏仔细核对。CAN总线通信就像一场精密的舞蹈字节序就是舞步的节奏一步踏错整个舞蹈就乱了。希望这篇长文能帮你把Motorola和Intel这两个“舞步”彻底分清在以后的项目中跳得更加流畅稳健。

相关文章:

深入解析CAN总线字节序:Motorola与Intel格式的实战对比

1. 从一次数据解析“翻车”说起:为什么字节序这么重要? 大家好,我是老张,在汽车电子和嵌入式领域摸爬滚打了十几年。今天想和大家聊聊一个看似基础,但实际项目中坑了无数工程师的“小”问题——CAN总线的字节序。你可能…...

CES 2026 的 Micro LED 真相:不是在拼亮度,而是在拼谁先把「抗突波」想清楚

在 CES 2026,Micro LED 已经正式走出「概念展示」阶段,开始进入可以卖、客户愿意买,但工程必须非常稳的产品化节奏。从展会讯号来看,方向非常明确:Samsung 展示的是可扩展的超大尺寸 Micro RGB 显示系统,不…...

告别账号切换折磨,让矩阵运营更轻松

做小红书矩阵运营的痛:运营10个、100个账号,每天反复切换登录、输密码,半天时间浪费在无效操作上;私信评论散在各后台,漏回慢回流失客源,还得熬夜守手机,苦不堪言。如果你也被这些问题折磨&…...

numpy.polyfit()与Stats.linregress()在最小二乘拟合中的性能差异与应用场景解析

1. 从“找规律”说起:为什么我们需要最小二乘拟合? 不知道你有没有过这样的经历?手头有一堆数据点,散乱地分布在坐标图上,你隐约觉得它们之间好像存在某种直线关系,但又没法用尺子画出一条完美的线穿过所有…...

从恢复余数法到非恢复余数法:Verilog除法器的核心算法实现与优化

1. 从手算到硬件:为什么除法器这么“难搞”? 很多刚接触数字电路设计的朋友,可能会觉得除法器和加法器、乘法器差不多,不就是个运算嘛,用Verilog写个“/”操作符不就完事了?我刚开始也是这么想的&#xff0…...

FPGA高速通信中Aurora64B/66B协议的性能优化与实战调优

1. 从“能用”到“好用”:Aurora 64B/66B协议性能调优的实战意义 如果你正在用FPGA做高速数据传输,比如板卡之间传图像、雷达数据,或者芯片之间跑海量计算中间结果,那你大概率听说过或者已经用上了Xilinx的Aurora 64B/66B IP核。很…...

微信小程序摇一摇功能实战:利用wx.onAccelerometerChange()实现趣味互动

1. 摇一摇功能,不只是“摇一摇” 说到微信小程序里的“摇一摇”,很多朋友第一反应可能就是微信自带的那个摇一摇找朋友或者摇歌曲的功能。其实,我们自己开发小程序,完全可以利用手机内置的传感器,做出各种各样好玩的“…...

Enhancing ImageNet Classification with Advanced Deep Convolutional Neural Networks

1. 从AlexNet到现代:ImageNet分类的进化之路 十年前,当AlexNet在ImageNet竞赛中一鸣惊人时,很多人可能还没意识到,那扇通往现代计算机视觉的大门被彻底撞开了。我记得当时读到那篇论文,最震撼我的不是它拿了冠军&#…...

从实战到算法:五子棋斜指开局十三式的AI破局思路

1. 从棋盘到代码:一个棋手的AI算法构建心路 十年前,我刚开始琢磨怎么让电脑下五子棋的时候,想法特别简单:不就是找连成五个子的地方吗?后来跟真人高手一过招,发现完全不是那么回事。电脑走出来的棋&#xf…...

汽车OTA技术演进:从SOTA到FOTA的智能化升级路径

1. 从“功能机”到“智能机”:汽车OTA的进化之路 十年前,我们买一辆车,从4S店开出来的那一刻,这辆车的“智商”和“能力”基本就定格了。导航地图过时了?得去4S店花钱升级。发现了一个软件小Bug?只要不影响…...

FunASR实战:从Docker部署到SpringBoot集成的全链路语音识别应用

1. 开篇:为什么选择FunASR来构建你的语音识别应用? 如果你正在寻找一个开箱即用、功能强大且部署灵活的语音识别解决方案,那么FunASR绝对值得你花时间深入了解。我最初接触它,是因为一个需要处理大量客服录音转写的项目。市面上成…...

5G NR PUSCH资源分配策略与性能优化实战解析

1. 从理论到实战:为什么PUSCH资源分配是5G优化的关键 如果你在5G网络优化或者设备开发一线工作过,肯定遇到过这样的问题:明明信号满格,为什么上传速度就是上不去?或者,一个关键的工业控制指令,为…...

PowerDNS主从架构实战:构建高可用内网DNS解析系统

1. 为什么你需要一个高可用的内网DNS系统? 如果你在公司里负责过运维或者开发,肯定遇到过这种场景:某个内部系统突然访问不了了,一查发现是DNS解析出了问题。可能是负责解析的服务器挂了,也可能是配置被误改了。这时候…...

【MoveIt 2】利用MoveIt任务构造器实现多阶段物体抓取与放置任务

1. 为什么需要MoveIt任务构造器?从“硬编码”到“乐高式”编程 如果你曾经尝试用MoveIt 2的MoveGroupInterface来写一个完整的“抓取-移动-放置”任务,我猜你大概率会经历一段“痛苦”的时光。我刚开始做机械臂应用的时候,也是这么过来的&…...

AI驱动文献综述:从选题到成稿的智能工作流与实战提示词

1. 从“文献焦虑”到“AI流水线”:我的综述写作革命 写文献综述,大概是每个研究生和青年学者都绕不开的“噩梦”。我还记得自己读博初期,面对海量文献时的那种窒息感:关键词一搜,几千篇论文跳出来,光是看标…...

STM32无RNG单元时,巧用ADC噪声与SysTick生成高随机性数值

1. 当你的STM32没有“骰子”时,怎么办? 玩过单片机开发的朋友都知道,随机数在很多场景里都扮演着关键角色。比如,你想做一个抽奖小游戏,或者让设备每次启动时生成一个唯一的ID,又或者在一些简单的加密场景里…...

MicroPython ESP32 UART Modbus 故障诊断与主从切换

1. 从“偷听”开始:理解UART监听Modbus的核心价值 大家好,我是老张,在工业自动化和物联网这块摸爬滚打了十几年。今天想和大家聊聊一个非常实用,但又常常被新手朋友觉得有点“玄乎”的场景:用一块小小的ESP32开发板&am…...

NOAA 中国区域 18 类地面气象要素逐日数据(1942-2025 年 8 月)汇总与 CSV 格式解析

一、引言 NOAA(美国国家海洋和大气管理局)的全球地面气象逐日数据集(GHCN-Daily/GSOD)是气象科研、气候分析、工程规划等领域的核心基础数据,涵盖全球超 10 万个气象站点的多维度观测记录。本文聚焦中国区域&#xff…...

eNSP实战:从零到一构建高可用无线校园网仿真方案

1. 为什么你需要用eNSP搞定一个高可用的无线校园网? 如果你是一名网络工程专业的学生,或者刚入行的网络工程师,面对“校园网”这个课题,是不是感觉头大?设备贵、环境复杂、不敢乱动真机……这些我都经历过。十年前我刚…...

Python之a2anet包语法、参数和实际应用案例

a2anet包概述 a2anet是一个用于实现Attention Aggregation Network (A2-Net) 架构的Python库,主要用于点云数据的深度学习处理。A2-Net是一种高效的点云特征提取网络,通过自注意力机制捕捉点之间的长距离关系,在点云分类、分割等任务中表现出…...

Python之a2a-agent-mcpserver-generator包语法、参数和实际应用案例

a2a-agent-mcpserver-generator 包功能概述 a2a-agent-mcpserver-generator 是一个专为Python设计的高级工具包,主要用于快速构建和部署多客户端服务器架构。它基于异步编程模型,支持多线程和协程,特别适合开发需要处理大量并发连接的网络应用…...

第8讲 数据库的设计与实施

一、数据库设计的特点1.数据库设计方法新奥尔良方法基于E-R模型的数据库设计方法基于3NF的设计方法对象定义语言(Object Definition Language,ODL)方法2.数据库设计的基本步骤1)需求分析获取需求是整个设计过程的基础。进行数据库设计时首先必须准确了解与分析用户的…...

Springboot+vue宠物领养救助平台的设计与实现

文章目录前言源码获取(稀缺资源,尽快转存到自己网盘,防止失效)详细视频演示具体实现截图后端框架SpringBoot前端框架Vue持久层框架MyBaits成功系统案例:参考代码数据库前言 博主介绍:CSDN特邀作者、985高校计算机专业…...

Springboot+vue房屋租赁管理系统的设计与实现

文章目录前言源码获取详细视频演示具体实现截图后端框架SpringBoot前端框架Vue持久层框架MyBaits成功系统案例:数据库前言 博主介绍:CSDN特邀作者、985高校计算机专业毕业、现任某互联网大厂高级全栈开发工程师、Gitee/掘金/华为云/阿里云/GitHub等平台持续输出高质…...

Windows下5分钟搞定内网穿透:qydev和飞鸽对比实测(附避坑指南)

Windows内网穿透实战:从零到精通的避坑与效率指南 最近在帮几个刚入行的朋友搭建本地开发环境的外部访问时,发现大家普遍对“内网穿透”这个概念既熟悉又陌生。熟悉的是,几乎每个开发者都遇到过需要临时把本地的Web服务、数据库或者测试API暴…...

全面指南:探索域名解析的五大实用方法

1. DNS查询:互联网的“电话本”是如何工作的? 每次你在浏览器里输入“www.baidu.com”并按下回车,到页面加载出来,这背后其实发生了一系列精密的“寻址”操作。这个把好记的域名翻译成计算机能识别的IP地址(比如“14.2…...

避坑指南:Simulink Scope导出数据总出错?这5个参数设置90%的人没搞对

避坑指南:Simulink Scope导出数据总出错?这5个参数设置90%的人没搞对 如果你经常和Simulink打交道,尤其是需要把Scope里那些漂亮的波形数据导出来,在MATLAB里做进一步分析、画报告图,或者存档,那你大概率踩…...

别让这些软件,偷走你新学期的效率!电脑卡顿元凶排查指南。

“开学才三天,电脑打开Word都要转圈圈!”“PPT做到一半直接卡死,差点想砸电脑!”这几天小A收到不少类似的私信:明明上学期还好好的,怎么新学期一开电脑就卡成PPT?(图片由AI生成&…...

开学焕新,一步到位!这台「全能学霸本」,让你从宿舍赢到图书馆

回想一下当年选电脑的自己,是不是满脑子的“性能拉满,游戏全开”,非高性能游戏本不选?结果呢,明明也不怎么玩游戏,愣是每天背着不够轻便的笔记本爬四五层楼,去教室、去图书馆、去自习室。还没毕…...

保姆级教程:在Ubuntu 22.04上为ROS2 Humble切换Cyclone DDS(含网卡指定技巧)

保姆级实战:在Ubuntu 22.04上为ROS2 Humble深度优化Cyclone DDS配置 最近在实验室调试一个多机器人协同项目,节点间通信时不时出现延迟抖动,排查了半天才发现,默认的通信中间件在复杂的网络拓扑下有点“力不从心”。和几位深耕机器…...