《C#上位机开发从门外到门内》2-3:SPI总线协议详解及应用实践

文章目录
- 一、引言
- 二、SPI总线协议的基本原理
- 三、SPI通信模式详解 —— CPOL与CPHA
- 3.1 时钟极性(CPOL)
- 3.2 时钟相位(CPHA)
- 3.3 四种SPI模式
- 四、主从设备通信机制
- 4.1 通信流程概述
- 4.2 数据帧结构与传输细节
- 4.3 主设备与从设备的协同工作
- 五、上位机实现SPI通信
- 5.1 硬件接口与驱动支持
- 5.2 软件实现方法
- 5.2.1 基于硬件SPI模块的实现
- 5.2.2 基于软件模拟SPI(Bit-Banging)的实现
- 六、实例分析与调试技巧
- 6.1 常见问题及故障排查
- 6.2 调试工具与方法
- 6.3 实例应用
- 七、总结与展望
- 结语

一、引言
在嵌入式系统、工业自动化、消费电子以及数据采集等领域中,总线通信协议扮演着至关重要的角色。SPI(Serial Peripheral Interface,串行外设接口)总线协议作为一种高速、全双工的同步串行通信协议,由摩托罗拉公司提出并广泛应用于各类设备之间的数据交换。相较于I²C协议,SPI通信具备传输速度快、通信模式灵活、实现简单等优势,因此在需要高速数据传输或对延迟要求较高的场合,SPI成为主流选择。
本篇文章将深入探讨SPI总线协议的基本原理、通信模式(特别是CPOL与CPHA的详细定义与影响)、主从设备之间的通信机制以及上位机在实际应用中的实现方法。通过系统分析SPI通信各环节的设计思想和实际应用实例,旨在为工程师在系统设计、调试及故障排查中提供详尽的理论指导和实践参考。

二、SPI总线协议的基本原理
SPI总线是一种全双工、同步串行通信协议,主要由主设备(Master)与一个或多个从设备(Slave)构成。SPI通信一般至少需要四根信号线,每根信号线都有其特定的作用:
-
SCLK(Serial Clock,时钟信号)
由主设备生成的同步时钟信号,用于同步数据传输。时钟频率的高低直接影响数据传输速率,是SPI协议高速通信的基础。 -
MOSI(Master Out Slave In,主设备发送从设备接收)
用于主设备向从设备发送数据。在数据传输过程中,主设备将数据按位依次输出,从设备接收并存储数据。 -
MISO(Master In Slave Out,从设备发送主设备接收)
用于从设备向主设备传送数据。SPI协议支持全双工通信,数据可以在同一时钟周期内双向传输,即主设备在发送数据的同时,也能接收从设备传来的数据。 -
CS/SS(Chip Select/Slave Select,片选信号)
用于选择具体的从设备。主设备通过拉低相应从设备的CS信号来启动数据传输,结束时再将该信号置为高电平。对于多从设备系统,通常需要为每个从设备单独提供一个CS信号,或通过其他多路复用技术实现选中操作。
SPI通信协议的最大特点在于其全双工数据传输方式和高速传输能力。由于数据传输与时钟同步进行,理论上在每个时钟周期内都可实现一位数据的交换,从而使得SPI总线在需要大数据量快速传输的场合表现优异。
三、SPI通信模式详解 —— CPOL与CPHA
SPI通信模式主要由两个参数决定:时钟极性(CPOL)和时钟相位(CPHA)。这两个参数共同决定了数据在SCLK信号中的采样时刻和传输边沿。理解CPOL和CPHA的含义,对于正确配置SPI接口、保证数据传输的稳定性至关重要。
3.1 时钟极性(CPOL)
CPOL用来定义时钟信号空闲状态下的电平,即在没有数据传输时,SCLK保持高电平还是低电平:
- CPOL = 0:表示空闲状态下SCLK为低电平。当通信开始时,SCLK将从低电平开始变化。
- CPOL = 1:表示空闲状态下SCLK为高电平。当通信开始时,SCLK将从高电平开始变化。
在不同的硬件设计中,CPOL的设置需要与从设备的要求相匹配。若主从设备之间的CPOL不一致,就可能导致数据采样时出现错误,从而引起数据传输异常。
3.2 时钟相位(CPHA)
CPHA用于定义数据采样时钟边沿的选择,主要决定数据在时钟信号的哪一个边沿(上升沿或下降沿)采样:
- CPHA = 0:数据在第一个时钟边沿采样,即当SCLK从空闲状态开始转换时就采样数据。数据应在时钟信号切换之前稳定。
- CPHA = 1:数据在第二个时钟边沿采样,即数据在第一个边沿改变后,再于下一个边沿采样。这样做的好处在于为数据的稳定提供了更多的时间。
3.3 四种SPI模式
结合CPOL和CPHA的不同设置,SPI协议通常定义了四种工作模式,分别为:
-
模式0(CPOL=0,CPHA=0)
空闲状态下SCLK为低电平,数据在SCLK的上升沿采样。传输数据时,数据变化通常发生在SCLK下降沿。模式0在很多低速外设中广泛应用。 -
模式1(CPOL=0,CPHA=1)
空闲状态下SCLK为低电平,数据在SCLK的下降沿采样。此模式下,数据在第一个边沿发生变化,在第二个边沿采样。适用于对数据稳定性要求较高的场合。 -
模式2(CPOL=1,CPHA=0)
空闲状态下SCLK为高电平,数据在SCLK的下降沿采样。数据通常在SCLK上升沿发生变化,确保数据在下降沿采样时稳定。模式2常用于某些特定硬件设备要求高时钟电平的场合。 -
模式3(CPOL=1,CPHA=1)
空闲状态下SCLK为高电平,数据在SCLK的上升沿采样。数据变化发生在SCLK下降沿,传输时延相对模式2稍有不同。该模式适用于对时序要求较严谨的系统。
不同设备对SPI模式的要求可能不同,工程师在设计系统时必须查阅器件手册,确认所需的CPOL与CPHA设置。若主设备与从设备的SPI模式不一致,数据采样可能出现偏移或错误,从而导致通信失败或数据损坏。
四、主从设备通信机制
SPI通信采用主从架构,主设备负责生成时钟、控制片选信号以及数据读写,从设备则根据主设备的指令进行数据接收和发送。下面详细介绍主从设备间的通信流程及关键要点。
4.1 通信流程概述
典型的SPI通信流程可分为以下几个步骤:
-
片选控制
在通信开始前,主设备首先通过拉低目标从设备的CS(Chip Select)信号,通知从设备准备进入通信状态。对于多从设备系统,只有被选中的从设备响应后续的数据传输。 -
时钟同步
主设备产生SCLK信号,作为所有数据传输的同步时钟。时钟的频率由主设备配置,确保数据传输速率满足系统要求。 -
数据发送与接收
- 全双工通信:SPI支持全双工数据传输,即在每个时钟周期内,主设备在MOSI线上发送数据的同时,从设备在MISO线上传回数据。这样设计使得数据交换效率极高。
- 数据位序:通常情况下,每个数据帧为8位,也有部分设备支持16位或更长的数据帧。数据传输过程中,数据从高位到低位或相反顺序依赖具体实现。
-
数据同步与确认
虽然SPI协议没有类似I²C那样的ACK机制,但数据采样依赖严格的时钟同步以及信号时序设计。主从设备在设计时需要保证数据在传输过程中没有干扰或时序偏差,否则可能造成数据错误。 -
结束通信
数据传输完成后,主设备将CS信号置为高电平,从而结束本次通信,通知从设备退出通信状态,SPI总线恢复空闲。
4.2 数据帧结构与传输细节
在SPI总线中,数据传输通常按照“数据帧”进行,每个数据帧的结构受SPI模式的影响。典型的数据帧包括:
- 起始状态:主设备拉低CS信号,启动通信。
- 数据传输:在SCLK控制下,数据在MOSI和MISO线上同时传输。数据位的传输顺序(MSB优先或LSB优先)通常在硬件配置时指定。
- 结束状态:主设备在传输完所有数据后拉高CS信号,结束通信。
在实际应用中,数据帧的长度可以根据应用需求进行设定。某些场合需要连续传输多个数据帧,此时主设备可不间断地输出数据,保证数据流的连续性。为了确保数据稳定,系统设计时往往会在每个数据帧之间插入一定的延时,或通过硬件流水线技术优化传输时序。
4.3 主设备与从设备的协同工作
在SPI系统中,主设备起到了“总线控制者”的作用,其主要任务包括:
- 产生稳定的时钟信号(SCLK),并根据CPOL/CPHA配置保证正确的时序。
- 根据具体的应用场景,通过软件或硬件管理CS信号,精确控制从设备的选中与释放。
- 同时处理MOSI和MISO两路数据,通过硬件FIFO或DMA技术提升数据传输效率,降低CPU负载。
从设备在接收到CS信号拉低后进入通信模式,开始同步接收主设备发送的数据,并在对应时钟边沿输出数据到MISO线上。由于SPI采用全双工传输,从设备的响应速度必须能够跟上主设备的时钟频率,这对于硬件电路设计提出了较高要求。
在设计多从设备系统时,还需考虑总线共享问题。通常,每个从设备都配有独立的CS信号,或通过多路复用技术实现片选。硬件设计师还需注意总线长度、阻抗匹配以及干扰抑制,确保在高速传输下信号质量不受影响。
五、上位机实现SPI通信
上位机在SPI通信中通常作为主设备,负责生成时钟、管理数据传输以及控制从设备。上位机的实现既可以基于专用的硬件SPI控制器,也可以采用软件模拟(Bit-Banging)方式实现。下面详细介绍上位机实现SPI通信的关键环节及常用方案。
5.1 硬件接口与驱动支持
在上位机平台(例如嵌入式Linux系统、单片机开发板或PC机)中,实现SPI通信的第一步是确保硬件平台具备SPI控制器。现代单片机如STM32、NXP、TI系列均内置SPI模块,用户只需通过寄存器配置实现SPI初始化。对于PC机系统,则可以通过USB-SPI转换器或专用的扩展板实现SPI通信。
常见的硬件接口特点包括:
- 时钟频率配置:主设备需提供稳定的SCLK信号,时钟频率的选择依赖于从设备的最大支持速率以及总线电气特性。
- 数据帧格式配置:包括数据位宽、传输顺序(MSB优先或LSB优先)、以及SPI模式(模式0~3)的选择。
- 错误检测与中断支持:部分SPI控制器支持FIFO缓存、中断触发以及DMA传输,能够大幅降低CPU负载并提高数据吞吐率。
在Linux系统中,SPI设备通常由内核SPI子系统管理,用户可以通过设备文件(如/dev/spidev0.0)进行读写操作。内核提供的驱动程序(如spidev驱动)将SPI设备抽象成文件接口,使得上位机应用程序能够方便地调用标准I/O函数实现数据传输。
5.2 软件实现方法
5.2.1 基于硬件SPI模块的实现
利用硬件SPI模块时,上位机软件通常遵循如下步骤:
-
初始化SPI接口
- 配置SPI模式(CPOL和CPHA),选择数据位宽(8位、16位等)。
- 设置传输速率:通过时钟分频器确定SCLK频率,保证在从设备允许范围内工作。
- 初始化CS引脚:配置为GPIO输出或由硬件自动控制,确保在数据传输前后正确管理片选信号。
-
数据读写操作
- 调用驱动提供的接口函数(如Linux下的
ioctl、read和write等)将数据写入SPI数据寄存器。 - 在全双工模式下,主设备可同步接收从设备数据,将接收到的数据存入缓冲区。
- 调用驱动提供的接口函数(如Linux下的
-
中断与错误处理
- 对于高速传输或批量数据传输,可采用中断模式或DMA方式提高数据处理效率。
- 在传输过程中,监测错误标志位,对总线故障、数据溢出等情况进行及时处理和恢复。
下面给出一个基于Linux下spidev设备文件的示例代码(伪代码):
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdint.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>#define DEVICE "/dev/spidev0.0"
#define SPI_MODE SPI_MODE_0 // 对应CPOL=0, CPHA=0
#define BITS_PER_WORD 8
#define MAX_SPEED 500000 // 最大传输速率500kHzint main(void) {int spi_fd;uint8_t tx_buf[3] = {0xAA, 0xBB, 0xCC};uint8_t rx_buf[3] = {0};// 打开SPI设备spi_fd = open(DEVICE, O_RDWR);if (spi_fd < 0) {perror("无法打开SPI设备");exit(1);}// 设置SPI参数:模式、位宽和时钟速率if (ioctl(spi_fd, SPI_IOC_WR_MODE, &SPI_MODE) < 0) {perror("设置SPI模式失败");close(spi_fd);exit(1);}if (ioctl(spi_fd, SPI_IOC_WR_BITS_PER_WORD, &BITS_PER_WORD) < 0) {perror("设置SPI位宽失败");close(spi_fd);exit(1);}if (ioctl(spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &MAX_SPEED) < 0) {perror("设置SPI时钟失败");close(spi_fd);exit(1);}// 构建SPI传输结构体struct spi_ioc_transfer tr = {.tx_buf = (unsigned long)tx_buf,.rx_buf = (unsigned long)rx_buf,.len = sizeof(tx_buf),.delay_usecs = 0,.speed_hz = MAX_SPEED,.bits_per_word = BITS_PER_WORD,};// 执行数据传输if (ioctl(spi_fd, SPI_IOC_MESSAGE(1), &tr) < 0) {perror("SPI传输失败");close(spi_fd);exit(1);}printf("接收到的数据:0x%X 0x%X 0x%X\n", rx_buf[0], rx_buf[1], rx_buf[2]);close(spi_fd);return 0;
}
该示例展示了如何在Linux系统中通过SPI设备文件进行简单的数据交换。在实际项目中,还需考虑错误重传、超时检测以及对特殊硬件要求的支持。
5.2.2 基于软件模拟SPI(Bit-Banging)的实现
在某些硬件平台上,可能不存在专用的SPI模块,此时可以采用软件模拟SPI的方法,即通过普通GPIO口按照SPI时序手动控制数据输出和时钟信号。实现步骤包括:
- GPIO初始化:配置对应的GPIO为输出(用于SCLK、MOSI、CS)和输入(用于MISO)。
- 时序控制:通过软件延时精确定时,模拟时钟上升沿和下降沿,从而实现数据的移位和采样。
- 数据传输:依次控制每一位数据的输出,同时在相应边沿读取MISO口数据,完成全双工通信。
虽然软件模拟方式速度通常低于硬件SPI,但在简单应用和调试原型阶段依然具有较高的灵活性和易用性。
六、实例分析与调试技巧
在实际工程中,SPI通信往往会面临各种复杂情况,如信号干扰、时序偏差、不同设备间电平不匹配等。以下将介绍一些常见的调试方法和实例分析,帮助工程师快速定位和解决问题。
6.1 常见问题及故障排查
-
数据错误或丢失
- 原因:时钟频率设置过高、时序控制不准确、信号干扰或电平不匹配。
- 解决方案:使用示波器或逻辑分析仪监控SCLK、MOSI、MISO以及CS信号的时序;降低时钟频率;检查电气连接及终端匹配电阻;确认SPI模式配置正确。
-
从设备无响应
- 原因:片选信号未正确拉低;从设备初始化失败;SPI模式设置错误。
- 解决方案:检查CS信号的状态;确认从设备上电正常、初始化正确;参考设备手册验证CPOL、CPHA设置。
-
全双工数据混乱
- 原因:数据移位顺序错误;数据采样与时钟边沿不匹配。
- 解决方案:重新确认数据位顺序(MSB优先或LSB优先)的配置;检查SPI时钟相位设置是否与从设备匹配。
6.2 调试工具与方法
-
逻辑分析仪
利用逻辑分析仪采集SPI总线上各信号的时序图,观察SCLK、MOSI、MISO和CS信号的电平变化及边沿时序,能够直观判断数据传输是否符合预期时序。 -
示波器
通过示波器监控模拟信号波形,检查信号上升/下降时间、噪声干扰以及电平稳定性,对解决电气连接问题和信号完整性提供有力支持。 -
软件调试与日志记录
在上位机驱动或应用程序中添加详细的调试信息,记录每次传输的数据、错误码及时间戳,便于在系统出现异常时进行回溯和分析。
6.3 实例应用
以某嵌入式系统中与SPI闪存通信为例,工程师需完成如下任务:
-
系统初始化
- 配置SPI主设备:设置工作模式(如模式0或模式3)、数据位宽、时钟频率等参数。
- 初始化GPIO口,确保CS信号能够准确控制闪存片选。
-
数据读写操作
- 写操作:先发送写命令及目标地址,然后传送数据。
- 读操作:发送读命令及地址,接收返回的数据。
- 每次传输完成后均需拉高CS信号,确保闪存正确保存数据。
-
错误处理
- 针对闪存写入可能存在的写保护、忙状态等情况,设计超时重传机制。
- 结合硬件调试工具,验证SPI时序是否满足闪存器件手册要求,调整时钟频率和数据传输延时。
通过对具体实例的调试和验证,工程师能够积累丰富的SPI通信经验,为后续系统设计提供宝贵参考。
七、总结与展望
本文详细讲解了SPI总线协议的基本原理、通信模式(重点解析了CPOL和CPHA的工作原理及其对数据传输时序的影响)、主从设备间的通信机制以及上位机实现SPI通信的具体方法。主要内容总结如下:
-
SPI总线协议基础
- SPI采用全双工同步串行通信,通过SCLK、MOSI、MISO和CS四根信号线实现高速数据传输。
- 主设备负责生成时钟及控制片选信号,从设备按时钟同步传输数据,保证通信效率。
-
通信模式与时钟配置
- CPOL决定时钟空闲状态下的电平,CPHA决定数据采样边沿。
- 四种SPI模式(模式0~3)在不同应用中各有优缺点,工程师需依据器件要求进行选择。
-
主从通信及应用实例
- 主设备通过精确控制时钟及片选信号,实现对从设备的可靠数据交换。
- 上位机实现SPI通信可基于硬件SPI模块或软件模拟方式,各有适用场景与优缺点。
- 在实际应用中,借助逻辑分析仪、示波器和详细调试日志,有效定位并解决数据错误、时序偏差等问题。
-
上位机实现SPI通信的关键技术
- 利用Linux下的spidev设备文件实现数据传输,通过ioctl接口设置SPI工作模式、位宽和时钟速率。
- 软件模拟SPI(Bit-Banging)为缺乏硬件支持的平台提供了解决方案,尽管传输速度较低,但适用于部分低速设备通信。
展望未来,随着嵌入式系统与物联网设备对高速、低延迟通信的需求不断增加,SPI总线协议在数据传输效率、信号完整性以及多设备协同工作方面将持续得到优化。新一代的SPI控制器不仅在硬件层面支持更高的传输速率,还能结合DMA、中断技术实现数据流的自动管理,为复杂系统提供更为可靠的数据通道。
同时,随着系统集成度不断提高,多总线混合通信模式(如SPI与I²C、UART、CAN等联合应用)也将成为趋势。在这种背景下,工程师需要深入理解各种总线协议的特性,并针对具体应用场景进行合理选择与优化设计。通过不断积累和总结实践经验,将有助于实现更高效、更稳定的系统通信方案。
结语
SPI总线协议以其全双工、高速传输和灵活的通信模式在工业、消费电子和嵌入式系统中占据重要地位。本文从SPI的基本原理出发,详细解析了CPOL与CPHA对通信时序的影响,介绍了主从设备间的协同工作机制,并结合上位机实现SPI通信的方法和实际应用案例,为工程师提供了一份系统而深入的技术指南。希望本文能够为从事硬件设计和系统调试的技术人员在解决SPI通信问题时提供有力支持,同时也为后续相关技术的研究和发展奠定理论基础。
通过对SPI总线协议的全面分析,我们可以看到在高速数据传输、低延迟响应和系统扩展性方面,SPI依然具有不可替代的优势。未来,随着新材料、新工艺和新技术的不断涌现,SPI及其它总线协议将在满足更高数据传输需求的同时,实现更智能、更高效的系统协同工作模式,为各类创新应用提供坚实的通信平台。
相关文章:
《C#上位机开发从门外到门内》2-3:SPI总线协议详解及应用实践
文章目录 一、引言二、SPI总线协议的基本原理三、SPI通信模式详解 —— CPOL与CPHA3.1 时钟极性(CPOL)3.2 时钟相位(CPHA)3.3 四种SPI模式 四、主从设备通信机制4.1 通信流程概述4.2 数据帧结构与传输细节4.3 主设备与从设备的协同…...
vscode出现:No module named ‘requests‘ 问题的解决方法
问题: ① No module named requests ② pip install requests:显示已经安装成功 运行失败原因: 我的失败原因是因为:我的python环境有两个,电脑C盘默认一个、pycharm下载后在它的路径下有一个。而vscode所运行的环境…...
【openwebui 搭建本地知识库(RAG搭建本地知识库)】
安装准备 openwebui 这个本地安装之前写过使用python安装。也可以直接用docker 命令 docker run --rm -d \-p 3080:8080 \-p 3081:8081 \-e WEBUI_AUTHtrue \-e DEFAULT_LOCALEcn \-e GLOBAL_LOG_LEVEL"INFO" \-e AIOHTTP_CLIENT_TIMEOUT100 \--privilegedtrue \-…...
Docker Compose 使用笔记
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具; docker-compose.yml 文件则是 Docker Compose 用来配置应用服务的核心文件,它以 YAML 格式编写。 YAML 文件用途: 服务定义:在 docker-compose.yml 文件中&…...
雷池WAF 处理 HTTP 请求的流程
项目介绍 SafeLine,中文名 "雷池",是一款简单好用, 效果突出的 Web 应用防火墙(WAF),可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、…...
JAVA-Thread类实现多线程
引言: 本章博客涉及进程线程内容,如果不了解的可以看:什么是进程线程-CSDN博客 线程是操作系统的概念,操作系统提供的API供程序员使用操作。但是不同的操作系统(Winodws、Linux、Unix……差别很大),但是做为JAVA程序员就不需要担心…...
【算法】DFS、BFS、拓扑排序
⭐️个人主页:小羊 ⭐️所属专栏:算法 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 持续更新中...1、DFS2、BFSN 叉树的层序遍历二叉树的锯齿形层序遍历二叉树最大宽度 3、多源BFS腐烂的苹果 4、拓扑排序 持续更新中…...
MySQL中 IN 到底走不走索引?
文章目录 前言数据库表结构查询sqlEXPLAIN介绍EXPLAIN 的输出每列解释 强制走索引查询时添加条件(复合索引字段)查询小时查询分钟 总结 前言 在 MySQL 中,IN 语句是否能够利用索引取决于多个因素,包括但不限于查询的具体形式、表的统计信息、索引的选择…...
centos没有ll
vi /etc/bashrc alias ll‘ls -l’ source /etc/bashrc...
腾讯云低代码开发应用
创建客户端应用 如上所示,登录腾讯云微搭低代码业务控制台,开始搭建企业官网应用 如上所示,在腾讯云微搭低代码业务控制台中,开始创建企业官网应用 如上所示,在腾讯云微搭低代码业务控制台中,开始编辑企业官…...
医疗APP开发如何实现跨机构数据互通
医疗APP开发如何实现跨机构数据互通 在数字化医疗时代,医疗APP开发已成为连接医疗机构、患者和医疗资源的重要桥梁。然而,如何实现跨机构的数据互通,成为医疗APP开发中的一大挑战。本文将探讨如何通过医疗APP开发实现跨机构数据互通,提升医疗服务效率和患者体验。我们将涵…...
深度学习项目--基于DenseNet网络的“乳腺癌图像识别”,准确率90%+,pytorch复现
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 如果说最经典的神经网络,ResNet肯定是一个,从ResNet发布后,很多人做了修改,denseNet网络无疑是最成功的…...
级联树SELECTTREE格式调整
步骤: 1、将全部列表设置成Map<Long, List<Obejct>> map的格式,方便查看每个父级对应的子列表,减少循环次数 2、对这个map进行递归,重新进行级联树的集合调整,将子集放置在对应的childs里面。 public Dyna…...
编译RTTR 0.9.6 (CMake + vs2019)解决std::iterator对rapidjson编译事项
RTTR编译 使用CMake和VS2019 x64编译RTTR 0.9.6指南一、下载RTTR 0.9.6并配置CMake二、在VS2019上编译RTTR 0.9.6解决rapidjson与C17兼容性问题 三、安装RTTR四、最简单的还是用vcpkg 使用CMake和VS2019 x64编译RTTR 0.9.6指南 本文将指导您完成从下载RTTR 0.9.6到使用CMake生…...
深入理解JavaScript构造函数与原型链:从原理到最佳实践
一、开篇:为什么需要理解原型链? 在JavaScript开发中,90%以上的"诡异"bug都与原型链机制相关。理解构造函数与原型链的运行原理,不仅能帮助我们写出更优雅的代码,还能在框架源码阅读、性能优化等场景中游刃…...
【Linux 指北】常用 Linux 指令汇总
第一章、常用基本指令 # 注意: # #表示管理员 # $表示普通用户 [rootlocalhost Practice]# 说明此处表示管理员01. ls 指令 语法: ls [选项][目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件…...
第27周JavaSpringboot 前后端联调
电商前后端联调课程笔记 一、项目启动与环境搭建 1.1 项目启动 在学习电商项目的前后端联调之前,需要先掌握如何启动项目。项目启动是整个开发流程的基础,只有成功启动项目,才能进行后续的开发与调试工作。 1.1.1 环境安装 环境安装是项…...
QT中的布局管理
在 Qt 中,布局管理器(如 QHBoxLayout 和 QVBoxLayout)的构造函数可以接受一个 QWidget* 参数,用于指定该布局的父控件。如果指定了父控件,布局会自动将其管理的控件添加到父控件中。 在你的代码中,QHBoxLa…...
.net 6.0 webapi支持 xml返回xml json返回json
// 添加控制器并配置格式化器 var builder WebApplication.CreateBuilder(); builder.Services.AddControllers(options > {options.Filters.Add<ContentTypeFilter>();options.ReturnHttpNotAcceptable true; // 强制要求Accept头匹配// 添加 XML 格式化器options.…...
docker 搭建alpine下nginx1.26/mysql8.0/php7.4环境
docker 搭建alpine下nginx1.26/mysql8.0/php7.4环境 docker-compose.yml services:mysql-8.0:container_name: mysql-8.0image: mysql:8.0restart: always#ports:#- "3306:3306"volumes:- ./etc/mysql/conf.d/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro- ./var/log…...
Android7上移植I2C-tools
一,下载源码 cd hardware/libhardware/tests git clone https://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git 二, 在 i2c-tools 目录添加 Android.mk 编译文件 LOCAL_PATH: $(call my-dir)################### i2c-tools ###############…...
Centos 7 修改语言和输入源为中文+修改终端快捷键复制为Ctrl+C、粘贴为Ctrl+V
目录 修改语言和输入源为中文 1、设置 2、Region & Language(区域和语言) 3、Add an Input Source(添加输入源) 4、修改语言为中文 5、Restart(重启) 6、Log Out (注销) …...
DeepSeek-进阶版部署(Linux+GPU)
前面几个小节讲解的Win和Linux部署DeepSeek的比较简单的方法,而且采用的模型也是最小的,作为测试体验使用是没问题的。如果要在生产环境使用还是需要用到GPU来实现,下面我将以有一台带上GPU显卡的Linux机器来部署DeepSeek。这里还只是先体验单…...
疯狂安卓入门,crayandroid
系列文章目录 文章目录 系列文章目录第一组 ViewGroup 为基类帧布局约束布局 第二组 TextView 及其子类button时钟 AnalogClock 和 TextClock计时器 第三组 ImageView 及其子类第四组 AdapterView 及其子类AutoCompleteTextView 的功能和用法ExapndaleListViewAdapterViewFlipp…...
批量测试IP和域名联通性
最近需要测试IP和域名的联通性,因数量很多,单个ping占用时间较长。考虑使用Python和Bat解决。考虑到依托的环境,Bat可以在Windows直接运行。所以直接Bat处理。 方法1 echo off for /f %%i in (E:\封禁IP\ipall.txt) do (ping %%i -n 1 &…...
Python——计算机网络
一.ip 1.ip的定义 IP是“Internet Protocol”的缩写,即“互联网协议”。它是用于计算机网络通信的基础协议之一,属于TCP/IP协议族中的网络层协议。IP协议的主要功能是负责将数据包从源主机传输到目标主机,并确保数据能够在复杂的网络环境中正…...
一招解决Pytorch GPU版本安装慢的问题
Pytorch是一个流行的深度学习框架,广泛应用于计算机视觉、自然语言处理等领域。安装Pytorch GPU版本可以充分利用GPU的并行计算能力,加速模型的训练和推理过程。接下来,我们将详细介绍如何在Windows操作系统上安装Pytorch GPU版本。 查看是否…...
股票交易所官方api接口有哪些?获取和使用需要满足什么条件
炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取…...
MoonSharp 文档五
目录 13.Coroutines(协程) Lua中的协程 从CLR代码中的协程 从CLR代码中的协程作为CLR迭代器 注意事项 抢占式协程 14.Hardwire descriptors(硬编码描述符) 为什么需要“硬编码” 什么是“硬编码” 如何进行硬编码 硬编…...
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
最近在思考一个问题:如何能够更好的分享主流框架源码学习笔记(主要是源码部分)?让有缘刷到的同学既可以有所收获,还能保持对相关技术架构探讨学习热情和兴趣。以及自己也保持较高的分享热情和动力。 今天尝试用一个SQL查询作为引…...
