零死角玩转stm32中级篇3-SPI总线
本篇博文目录:
- 一.基础知识
- 1.什么是SPI
- 2.SPI和IIC有什么不同
- 3.SPI的优缺点
- 4.SPI是怎么实现通信的
- 5.SPI 数据传输的步骤
- 6.SPI菊花链
- 7.通过SPI实现数据的读和写
- 二.STM32F103C8T6芯片SPI协议案例代码
一.基础知识
1.什么是SPI
SPI(Serial Peripheral Interface,串行外设接口)是一种同步的串行通信协议,它被用于在微控制器、存储器芯片、传感器和其他外围设备之间传输数据。SPI通常由四个线组成:时钟线(SCK)、主设备输出/从设备输入(MOSI)、从设备输出/主设备输入(MISO)和片选线(SS)。SPI通信中,数据在时钟的边沿上进行传输,以实现高速、可靠的数据传输。SPI可以支持单主机和多从机的连接方式,并且具有简单、灵活和可扩展的特点。
(主从连接方式1:一个主机上有多个SS片选信号去连接从机,如下图)
(主从连接方式2:一个主机上只有一个片选信号可以通过daisy-chained(菊花链)进行连接,如下图)
备注:图片来源于https://www.circuitbasics.com/basics-of-the-spi-communication-protocol/。
2.SPI和IIC有什么不同
SPI和I2C(Inter-Integrated Circuit,即IIC)都是常见的串行通信协议,它们在一些方面有所不同:
-
总线结构:SPI是点对点的结构,每个设备占用一个片选线;而I2C是多主从结构,允许多个设备通过两根共享的线路进行通信。
-
传输速率:SPI的传输速率通常比I2C更快,SPI可以达到几百MHz的传输速率,而I2C通常只能达到几十kHz或几百kHz的传输速率。
-
电气特性:SPI时钟线和数据线的电平是由驱动器控制的,因此SPI的电气特性更容易控制和优化,而且SPI在长距离传输时噪声抗干扰能力更强;而I2C的时钟和数据线由开漏输出控制,需要加上外部上拉电阻,电气特性控制相对较难。
-
硬件资源:SPI传输需要占用多个GPIO,因此需要更多的硬件资源来实现;而I2C只需要两个GPIO,可以减少芯片上的硬件资源占用。
总之,SPI和I2C都有其适用的场景。SPI适用于高速、简单的点对点通信,而I2C适用于多设备的通信,因为I2C允许多个设备在同一个总线上进行通信。
3.SPI的优缺点
优点:
- 没有启动和停止位,所以数据可以不间断地连续流
- 没有像 I2C 这样复杂的从站寻址系统
- 数据传输速率比 I2C 高(几乎是 I2C 的两倍)
- 单独的MISO 和 MOSI 线路,这样数据可以同时发送和接收
缺点:
- 使用四根线(I2C 和 UART 使用两根)
- 没有确认数据已经成功接收(I2C 有这个)
- 没有像 UART 中奇偶校验位那样的错误检查形式
- 只允许一个master
4.SPI是怎么实现通信的
① 在SPI通信中,数据是通过一个主设备与一个或多个从设备进行的。通信的过程是主设备向从设备发送数据,并且同时接收从设备发回的数据。SPI总线由四个信号线构成,分别是:
-
SCLK(Serial Clock):时钟线,用于同步主从设备之间的数据传输。
-
MOSI(Master Out Slave In):主设备输出数据到从设备的信号线。
-
MISO(Master In Slave Out):从设备输出数据到主设备的信号线。
-
SS(Slave Select):从设备的选中信号线,用于让主设备控制从设备的选择。
② 简单来说,当主设备需要跟某个从设备通信时,它会先把该从设备的SS线拉低(低电平有效还是高电平有效要根据元件的数据手册来看),表示选中该从设备,然后主设备以时钟信号为基准,通过MOSI线发送数据,从设备则通过MISO线将响应数据发回主设备。通信结束后,主设备会将该从设备的SS线拉高,表示不再选中该从设备。
③ SPI通信的速度可以通过调整时钟频率来实现,而具体的通信协议和数据格式则需要根据具体的应用场景来确定。
5.SPI 数据传输的步骤
- 主机(master)输出时钟信号
- 主机(master)将对应从机(方式一)的片选信号切换到低电平,从而激活对应从机
- 主机(master)通过MOSI线向从设备一次一位地向从机发送数据,从设备读取接收到的数据
- 如果从设备有相应的回应,从设备通过MISO线向主设备一次一位地向主机发送数据,主设备读取接收到的数据
6.SPI菊花链
在SPI菊花链方式中,各个从机的MISO(Master In Slave Out)输入都连接到前一个从机的MOSI(Master Out Slave In)输出上,一直到链的最后一个从机(如下图所示)。主机通过片选信号来选择与其通讯的从机,只有被选中的从机的MISO输出的数据才会被主机的MOSI输入。
备注:图片来源于https://zhuanlan.zhihu.com/p/290620901
具体的连接图如下:
SPI菊花链方式通信的基本步骤:
-
主机发送片选信号(CS)来选择要与之通讯的从机。
-
在所选从机的MISO输入处放置数据,同时主机在MOSI输出口发送相应的数据。
-
当所选从机选定数据并将其内容从MISO输出时,主机也会将其内容从它的MISO输入口中读取,完整的数据交换完成。
-
当主机需要与另一个从机通讯时,它会将片选信号切换到下一个从机上,然后重复上述步骤。
-
当通讯完成时,主机可以停止发送片选信号。
需要注意的是,在SPI菊花链方式中,所有从机的MISO都连接在同一条线上。在未选中的情况下,从机将忽略主机发出的数据。因此,在设计SPI系统时需要确保未选中的从机在通讯期间处于高阻状态,以避免因为信号冲突而产生干扰。
- 上文说所的未选中
① SPI菊花链中,所有从机都与同一条MISO线相连,但是在不同时间内只会有一个从机处于被选中状态,其他从机都处于未选中状态。这是通过从机的片选信号(CS)来实现的。当主机选择与某个从机通信时,它会向该从机的CS引脚发送低电平信号,从而告诉该从机它正在被选中。其他未被选中的从机,它们未选中时CS引脚通常为高电平状态,并且未选中的从机的MISO输出需要设置为高阻状态。
② 因此,在SPI菊花链方式中,需要确保未被选中的从机在通讯期间处于高阻状态,以避免干扰。最好的做法是在主机与某个从机通信之前,先将所有其他未选中的从机的片选信号拉高,保证它们的MISO输出都处于高阻状态。这样可以减少通信期间出现干扰的可能性。
- 什么是高阻态
① 高阻状态是指一个电路中的输入端或输出端等待输入或输出信号时,它处于一种电气状态,该状态被称作高阻态或三态,简称"Z"态。处于高阻态的信号线会表现出一种很高的电阻,阻止其他电路对其进行电流或电压的驱动,这样可以保证电路的安全和稳定性。
② 在数字电路中,高阻态被广泛应用于多路复用器、锁存器和开关等电路中。例如,在多路复用器中,当选择器控制线不代表选中任何一个输入端口时,所有的输入端口都处于高阻状态,以避免输入端口之间的干扰。在锁存器中,当时钟信号处于非稳定状态时,输入端口处于高阻态,以避免输出端脱离预期状态。在开关中,当输出端口未被激活时,它处于高阻状态,以防止从该端口流出意外的电流引起不必要的能量损耗。
7.通过SPI实现数据的读和写
通过SPI协议进行数据的读写操作和其他通信协议(UART,IIC)一样也会有相应的数据格式,下面给出是93C46存储器的SPI数据读写的格式(具体的读写的数据格式通过数据手册进行查询)。
和异步不同的是,数据的发送会受到时钟线的控制,如下,就是当SS(片选线)为高电平时,进行数据的读写操作,从机采样数据由极性和相位决定,极性决定时钟SCK空闲时是高电平还是低电平,相位决定在第一个跳边沿还是第二个跳边沿进行数据采集,下图就是极性为低电平,相位为第一个跳边沿(上升沿:低->高)进行数据采集,采集MOSI上的数据,从机采集到了1 01 0000001 0000 1111的数据,然后进行解析,数据解析的结果表示将向000 0001地址写入数据0000 1111数据,从机解析完毕,执行解析的动作。
① SPI数据采样是由SPI总线信号的时钟极性和相位来决定的。通常情况下,SPI信号是由主设备(如微控制器)发出的,从设备(如传感器或存储器)则根据时钟信号进行响应。使用SPI时,必须确保主设备与从设备使用相同的时钟极性和相位,以确保数据采样的正确性。
② SPI采样方式有四种:mode0、mode1、mode2和mode3。下面分别介绍各种采样方式的时钟极性和相位:
-
mode0:时钟极性为0,时钟相位为0。时钟极性为0表示空闲时时钟处于低电平,采样时时钟沿上升。时钟相位为0表示数据采样在时钟的上升沿进行,数据产生在下降沿。mode0是最常用的采样方式。
-
mode1:时钟极性为0,时钟相位为1。时钟相位为1表示数据采样在时钟的下降沿进行,数据产生在上升沿。
-
mode2:时钟极性为1,时钟相位为0。时钟极性为1表示空闲时时钟处于高电平,采样时时钟沿下降。时钟相位为0表示数据采样在时钟的下降沿进行,数据产生在上升沿。
-
mode3:时钟极性为1,时钟相位为1。时钟相位为1表示数据采样在时钟的上升沿进行,数据产生在下降沿。
上面的解析可能不容易进行理解,大致意思就是SPI由极性和相位决定,极性和相位有二种取值即0和1,这样一共就由4种采集方式(00 01 10 11),其中当极性为0时表示时钟空闲状态为低电平(第一个跳变为上升沿),为1表示时钟空闲状态为高电平(第一个跳变为下降沿);而相位为0表示在第一个跳边沿进行数据采集,为1时表示在第二个跳边沿进行数据采集。下图中的图1的CPOL表示极性;图2CPHA表示相位;这二张图片来源于https://www.cnblogs.com/gmpy/p/12461461.html。
(图1)
(图2)
具体的四种采样方式如下图所示:
至于数据的读取,主机先通过MOSI向从机发送读取的操作指令(1 10 地址),从机收到该命令后,就会将数据放在MISO线上,主机就可以通过MISO,从从机的MISO上采集到对应的数据。
备注上图的图片和表格来源于:https://www.bilibili.com/video/BV1F54y1M7e7/
二.STM32F103C8T6芯片SPI协议案例代码
以下是一个基于STM32F103C8T6单片机的SPI协议案例代码,仅供参考(来源于ChartGPT):
#include "stm32f10x.h"#define SPI_SCK_PIN GPIO_Pin_5 //SPI时钟引脚
#define SPI_MISO_PIN GPIO_Pin_6 //SPI数据接收引脚
#define SPI_MOSI_PIN GPIO_Pin_7 //SPI数据发送引脚
#define SPI_CS_PIN GPIO_Pin_4 //SPI片选引脚void SPI_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE); //使能SPI1外设时钟//配置SPI1对应的GPIO口GPIO_InitStructure.GPIO_Pin = SPI_SCK_PIN | SPI_MOSI_PIN | SPI_CS_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = SPI_MISO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStructure);//配置SPI1参数SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI1, &SPI_InitStructure);SPI_Cmd(SPI1, ENABLE); //使能SPI1外设
}void SPI_SendByte(SPI_TypeDef* SPIx, uint8_t byte)
{while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET) ; //等待发送缓冲区为空SPI_I2S_SendData(SPIx, byte); //将数据写入发送缓冲区while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET) ; //等待接收缓冲区非空SPI_I2S_ReceiveData(SPIx); //读取接收缓冲区数据,清除标志位
}uint8_t SPI_ReceiveByte(SPI_TypeDef* SPIx)
{while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET) ; //等待发送缓冲区为空SPI_I2S_SendData(SPIx, 0xFF); //发送一个空数据,触发SPI通信while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET) ; //等待接收缓冲区非空return SPI_I2S_ReceiveData(SPIx); //读取接收缓冲区数据
}int main(void)
{uint8_t tx_data = 0x55;uint8_t rx_data;SPI_Init(); //初始化SPI1GPIO_ResetBits(GPIOA, SPI_CS_PIN); //拉低SPI片选引脚,开始SPI通信SPI_SendByte(SPI1, tx_data); //发送数据rx_data = SPI_ReceiveByte(SPI1); //接收数据GPIO_SetBits(GPIOA, SPI_CS_PIN); //拉高SPI片选引脚,结束SPI通信while (1){//此处可添加其他代码}
}
以上代码实现了STM32F103C8T6单片机的SPI通信,并利用SPI1对应的GPIO口进行了初始化配置。在主函数中,通过拉低片选引脚、发送数据、接收数据、拉高片选引脚的方式实现了SPI通信。用户可以根据实际需求,在SPI_SendByte和SPI_ReceiveByte函数中修改数据的长度和数据位数等参数。
相关文章:
零死角玩转stm32中级篇3-SPI总线
本篇博文目录: 一.基础知识1.什么是SPI2.SPI和IIC有什么不同3.SPI的优缺点4.SPI是怎么实现通信的5.SPI 数据传输的步骤6.SPI菊花链7.通过SPI实现数据的读和写 二.STM32F103C8T6芯片SPI协议案例代码 一.基础知识 1.什么是SPI SPI(Serial Peripheral Interface&#…...
顺序表功能实现(入手版详解)
🍉博客主页:阿博历练记 📖文章专栏:数据结构与算法 🚚代码仓库:阿博编程日记 🌹欢迎关注:欢迎友友们点赞收藏关注哦 文章目录 🍓前言✨顺序表🔍1.顺序表的整体…...
Java 中的线程是什么,如何创建和管理线程-下(十三)
书接上文 CompletableFuture CompletableFuture 是 Java 8 中新增的类,提供了更为强大的异步编程支持。它可以将多个异步任务组合成一个整体,并且可以处理异常情况。 例如,可以使用 CompletableFuture 来实现异步任务的串行执行࿱…...
为什么我的Windows 10 便签不支持更改字体?
Windows便签是一款常用的记录工具,可以帮助我们快速记录一些重要的信息。在使用Windows便签时,如果你想要更好地呈现你的信息,可以通过设置字体来达到这个效果。本文将介绍Windows便签字体设置的相关知识,希望对你有所帮助。 1、打…...
野火STM32电机系列(六)Cubemx配置ADC规则和注入通道
前文已经配置了GPIO、编码器 本节讲解CubeMXADC规则和注入通道 本文adc注入通道采用定时器触发,因此在上文定时器配置的基础上进行 常规信号(温度等)使用带DMA的常规通道连续采样 注入采样由定时器触发,采集电机三相电流&…...
预制菜,巨头们的新赛场
俗话说“民以食为天”,饮食对于大众的重要性自然是无需赘述。然而,随着生活节奏的加快,越来越多年轻人没有时间和精力去烹制菜肴,这也是外卖行业持续火热的重要原因之一。尽管如此,随着消费者健康意识的持续提升&#…...
英语语法第一章之英语语法综述
英语的任何句型基本都可以翻译成 什么怎么样 ,在这里什么就是我们常说的主语,而怎么样就是我们常说的谓语; 可能有些小伙伴会反问,不是主谓宾吗?别急等我慢慢讲解 在这里谓语也有很有多的不同的动作 可以独立完成的动作 句型&am…...
ChatGPT被淘汰了?Auto-GPT到底有多强
大家好,我是可夫小子,关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。 说Auto-GPT淘汰了ChatGPT了,显然是营销文案里面的标题党。毕竟它还是基于ChatGPT的API,某种意义只是基于ChatGPT能力的应用。但最近,Auto…...
unity NGUI使用方法
基本用法 很多基本模块比如按钮、slider等都能从Prefab中直接拖拽到场景中实现,但都需要有一个Collider(Prefab已经自带) 因为不仅是UI,所有带有Collider的游戏物体都能接收到OnClick, OnPress这样的事件——前提是需…...
软件测试技术(五)软件测试流程
软件测试流程 软件测试流程如下: 测试计划测试设计测试执行 单元测试集成测试确认测试系统测试验收测试回归测试验证活动 测试计划 测试计划由测试负责人来编写,用于确定各个测试阶段的目标和策略。这个过程将输出测试计划,明确要完成的测…...
Redis缓存穿透和雪崩
Redis缓存穿透和雪崩 Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题…...
【C++】set和map的使用
对于STL容器来说,有很多相似的功能,所以这里主要将与之前不同的功能说清楚 文章目录 1.对于set与map的简单理解2. setinsert迭代器遍历countmultisetinsertfindcount 3. mapinsert与迭代器的使用统计水果次数 operator []operator[]的实现理解对整体的拆…...
大学生学java编程的就业前景怎么样?我来聊聊自己的见解
今天兴哥想跟大家分享一个话题,就是学java到底好不好找工作。因为我发现很多粉丝朋友,之前可能并不是从事IT行业的,然后想转行来做这一行,或者是有些大四即将面临毕业的老哥,可能大学没有好好学习吧,然后专…...
JavaScript全解析——canvas 入门(上)
●canvas 是 HTML5 新增的一个标签, 表示画布 ●canvas 也是 h5 的画布技术, 我们通过代码的方式在画布上描绘一个图像 canvas 标签 ●向进行 canvas 绘图, 首先我们先要了解到 canvas 标签 ●是 html5 推出的一个标签 <html> <head>... </head> <body&…...
vue 插槽的用法
Vue的插槽(Slot)是一种可以让父组件向子组件传递内容的机制。插槽可以让开发者将组件的结构和内容分离开来,从而实现更好的可维护性和复用性。 在Vue中,插槽通过 标签实现。具体用法如下: 单个插槽 在子组件中使用一…...
【C++复习2】C++编译器的工作原理
如果你是一名newbird的话,建议观看如下视频加深你的理解,再看如下内容: https://www.bilibili.com/video/BV1N24y1B7nQ?p7 The cherno会额外告诉你如何将目标文件转换成汇编代码,CPU执行指令的过程以及编译器如何通过删除冗余变…...
回调函数_回顾
函数指针和回调函数 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。 函数指针可以像一般函数一样,用于调用函数、传递参数。 直接用指针表示函数,而不是*指针ÿ…...
今天面了个字节跳动拿35K出来的,真是砂纸擦屁股,给我露了一手啊
今年的金三银四已经结束,很多小伙伴收获不错,拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文,为此咱这里也统一做一次大整理和大归类,这也算是划重点了。 俗话说得好,他山之…...
8. 数据结构与算法
8. 数据结构与算法 常见面试题 说说一个算法有哪些时间复杂度?归并算法时间复杂度是多少?⭐⭐⭐ O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) 归并算法时间复杂度是O(nlogn) 说说数组时间复杂度,什么场景下使用?⭐⭐⭐⭐⭐ 从渐进趋势…...
Springboot +Flowable,任务认领和回退(一)
一.简介 有的时候,一个任务节点会存在多个候选人,例如:张三提交一个任务,这个任务即可以由李四处理,又可以由王五处理,那么针对这种多个任务候选人的情况,该如何处理? 二.绘制流程…...
机器学习 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络模型答疑
机器学习 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络模型答疑 目录 机器学习 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络模型答疑问题汇总问题一答疑问题二答疑问题三答疑问题四答疑问题五答疑参考资料问题汇总 有几个问题咨询一下: 1.数据集划分时出现了问题如何解决? 2…...
卷首语:我决定从零开始,用C++手写自己的键值数据库
2023年5月1日,周一下午。 我为什么要自己写一个? 今天中午,我在CSDN上提出了一个关于如何学习C的观点——通过用C造东西来学习C,于是为了实践这个观点,我决定用C手写一个简单的属于自己的键值数据库。 我会把这个键值…...
【Vue】收集表单数据 过滤器
收集表单数据 收集表单数据: 若:<input type"text"/>,则v-model收集的是value值,用户输入的就是value值若:<input type"radio"/>,则v-model收集的是value值,且要给标签配置value值若…...
Linux线程:死锁
1. 死锁 (1)概念 死锁(DeadLock)指两个或两个以上的进程或线程执行时,由于竞争临界资源而造成阻塞的现象;若不干涉,则无法推进下去。 (2)死锁的原因 ① 竞争临界资源…...
thinkphp+vue+html超市零食品美食推荐系统零食购物商城网站7v281
本系统的开发使获取食品推荐系统信息能够更加方便快捷,同时也使食品推荐系统管理信息变的更加系统化、有序化。系统界面较友好,易于操作 运行环境:phpstudy/wamp/xammp等 开发语言:php 后端框架:Thinkphp5 前端框架:vu…...
思考外语学习的底层逻辑(以英语、法语为例)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言一、英语1.学习历程2.英语学习的心得3.理论检验(持续更新) 二、法语1.学习历程2.读入数据 总结 前言 提示:这里谈谈自己为什么要…...
命名ACL配置
命名ACL配置 【实验目的】 掌握命名ACL的配置。验证配置。 【实验拓扑】 实验拓扑如图1所示。 图1 实验拓扑 设备参数如表所示。 表1 设备参数表 设备 接口 IP地址 子网掩码 默认网关 R1 S0/3/0 192.168.1.1 255.255.255.252 N/A Fa0/0 192.168.2.1 255.255.…...
2008-2019年主要城市PITI指数
2008-2019年主要城市PITI指数 1、来源:附在文件内 2、时间区间:2008-2019年 3、具体时间分布:、2008、2009-2010、2011、2012、2013-2014、2014-2015、2015-2016、2016-2017、2017-2018、2018-2019、 4、范围:包括110个城市&a…...
拷贝构造函数和赋值重载函数详解
1.拷贝构造函数 1.1拷贝构造函数的概念 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。拷贝构造函数也是特殊的成员函数,其特征如下&#…...
5件关于JavaScript中this参数的事
this 关键字是 JavaScript 中最令人困惑的部分之一,本文试图通过介绍有关它的五个重要事项来阐明其目的和用法。 1、它允许访问同一对象上的其他属性 在 JavaScript 中,函数可以是独立的单元,但它们也可以用作对象的值。考虑下一个对象。 …...
注册独立网站有何用/哈尔滨企业网站模板建站
本平台并非真实运营和使用,仅在于学习研究平台前后端研发技术使用。 今天继续开始做这个平台的三大页之一:搜索页。 关于这里的设计其实就是对成员列表的管理。增加,还是搜索,还是查看,还是删除。 这个页面和第二个页…...
北京网站制作多少钱/百度竞价推广投放
用户 sa 登录失败。该用户与可信 SQL Server 连接无关联。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.SqlClient.SqlException: 用户 sa 登…...
网站后台管理界面下载/seo网络推广招聘
1.中文编码 如果直接执行以下代码会报错: print 中文 需要增加编码,如下两种方式均可以: # codingutf-8 # coding:utf-8 2.执行顺序 以下代码执行的结果: 中文 Hello print(中文)def test():print(Hello)if __name__ __…...
网站免费推广方案/市场营销专业就业方向
我在听这张,真好听 很怀念那些听歌的日子...
蚌埠市做网站/宁波专业seo服务
文章目录一、编写项目代码二、编写Azkaban必须文件三、使用Azkaban执行项目代码一、编写项目代码 package Azkaban;import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import java.util.Arr…...
wordpress更换网站logo/北京网站seo招聘
教程: 1、下载解压安装包,双击主程序开始安装,选择安装语言; 2、进入安装引导,点击【前进】; 3、接受软件许可协议,点击【我接受】,点击【前进】; 4、软件安装目录选择…...