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

ESP8266-01S、手机、STM32连接

1、ESP8266-01S的工作原理

1.1、AP和STA

ESP8266-01S为WIFI的透传模块,主要模式如下图:

上节说到,我们需要用到AT固件进行局域网应用(ESP8266连接的STM32和手机进行连接)。

  1. ESP8266为一个WiFi透传模块,和蓝牙透传模块具有主从两种工作模式一样,也具有两种工作模式:STA模式(Station)和AP模式(Access Point),一般WiFi模块还会有一个STA+AP模式,即可以在两种模式下切换的状态。
  2. AP模式下,WiFi模块产生热点,提供无线接入服务,允许其它无线设备接入,提供数据访问,一般的无线路由/网桥工作在该模式下。该模式对应TCP传输协议中的服务端(TCP Server)。
  3. STA模式下,WiFi模块为连接到无线网络的终端(站点),可以连接到AP,一般无线网卡工作在STA模式下。该模式对应TCP传输协议中的客户端(TCP Client)。

1.2、TCP/UDP/透传的概念,以及他们之间的不同点和相同点

TCP:

  1. TCP是一种面向连接的,提供可靠交付服务和全双工通信的,基于字节流的端到端的传输层通信协议。
  2. TCP在传输数据之前必须先建立连接,数据传输结束后要释放连接。
  3. 每一条TCP连接只能有2个端点,故TCP不提供广播或多播服务。
  4. TCP提供可靠交付,通过TCP连接传输的数据,无差错、不丢失、不重复、并且按序到达。
  5. TCP是面向字节流的。虽然应用进程和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。TCP并不知道所传输的字节流的含义。


UDP:

  1. UDP是一种无连接的,尽最大努力交付的,基于报文的端到端的传输层通信协议。
  2. UDP,在发送数据之前不需要建立连接。
  3. UDP不保证可靠交付,主机不需要位置复杂的连接状态。
  4. UDP是面向报文的。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的的边界,即应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。在接收端,UDP一次交付一个完整的报文。
  5. UDP没有拥塞控制,网络出现的拥塞不会使源主机的发送速率降低。
  6. UDP支持一对一、一对多、多对一和多对多的交互通信。
  7. UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。


透传:

  1. 透传,又称透明传输,具体来说就是“输入即输出(如从WiFi模块串口输入的字符会透传到服务器端)”,数据不改变,不同协议之间的转换(如串口到WiFi、蓝牙等)由模块完成。使用者无需关心内部具体实现,因此模块对于使用者是“透明的”、似乎不存在的(因为可无视中间的实现原理)。一个高度封装的模块,应该隐藏内部实现细节,仅对外提供使用接口

1.3、固件

固件:

固件是写入存储器中的程序,在单片机中就是写到Flash中的程序。即烧写进程序的flash(ROM),硬件根据该固件运行。

1.4、连接方式

 2、AT指令原理和配置

esp8266-01s在烧入固件后根据固件运行,固件中固定有配置和反馈指令,对其通过串口发送对应的指令,esp8266-01s会进行响应的配置。所以固件要根据自己的实际情况进行选择。你发对应指令,模块就会做相应的工作。

使用 AT 指令配置 ESP8266

通过 AT 指令,您可以对 ESP8266 进行各种配置,包括 Wi-Fi 连接、服务器设置等。以下是常用的 AT 指令以及如何使用它们配置 ESP8266 的步骤。

2.1、准备工作
  • 硬件连接:

    • 将 ESP8266 模块与 USB 转 TTL 适配器连接。
    • 确保正确接线(TX 到 RX,RX 到 TX,VCC 接 3.3V,GND 接地)。
  • 环境准备:

    • 使用串口工具(如 PuTTY、CoolTerm 或 Arduino Serial Monitor)打开串口通讯。
2.2、配置步骤AP模式
2.2.1 建立AP------------------------------------------------------------------------------------------------
1) 测试连接,串口对esp8266进行发送
AT
  • 如果返回 OK,表示与 ESP8266 的串口连接正常。

2) 查看固件版本
AT+GMR
  • 返回当前固件信息。

3) 设置工作模式
  • STA 模式(连接 Wi-Fi):
AT+CWMODE=1
  • AP 模式(创建热点):

AT+CWMODE=2
  • 混合模式(同时作为热点和客户端):
AT+CWMODE=3 
  • 查看工作模式
AT+CWMODE?
4) 设置AP名称

AT+CWSAP="Your_AP_Name","Your_Password",5,3

  • Your_AP_Name: 自定义的热点名称。
  • Your_Password: 热点的 Wi-Fi 密码(8 到 64 个字符)。
  • 5: 信道,值从 1 到 13。选择一个不冲突的信道。
  • 3: 安全模式(0:开放,1:WEP,2:WPA-PSK,3:WPA2-PSK,4:WPA/WPA2-PSK)。

5). 启动 AP
  • 设置 AP 后立即启动:
    • 上述 AT+CWSAP 指令执行后,ESP8266 会自动启动您配置的 AP。
6)获取 AP 配置信息
  • 查看当前 AP 配置:

AT+CWSAP?

7) 关闭 AP
  • 关闭当前 AP:

AT+CWQAP

8)查看当前连接状态
  • 检查已连接的客户端:

AT+CIPSTAMAC?
  • 用于获取已连接设备的 MAC 地址。
9)查看已接入设备的IP信息

AT+CWLIF

10)获取本设备IP

AT+CIFSR

2.2.2、Server 方法收发(可连接多设备)-----------------------------------------------------------------
1)、开启多连接模式

AT+CIPMUX=1

0-单路连接模式,1-多路连接模式(Server模式)

2)、创建服务器

AT+CIPSERVER=1,8080

  • 0-关闭 server 模式,1-开启 server 模式
  • 端口号,缺省值为 333

(1) AT+ CIPMUX=1 时才能开启服务器;关闭 server 模式需要重启

(2)开启 server 后自动建立 server 监听,当有 client 接入会自动按顺序占用一个连接。

3)关闭连接,关闭 server 模式需要重启,重启使用AT+ CIPMUX=1,重启后创建服务器AT+CIPSERVER=1,8080(例如)

AT+CIPSERVER=0

关闭服务器

 通过 fireTools.exe连接

串口助手 软件工具等
链接:百度网盘 请输入提取码    提取码:3p7y

可以看到连接失败,ESP8266默认ip为192.168.4.1,通过指令AT+CIFSR可以查看ESP8266自身的IP

需要设置超时时间,否则无数据时会超时自动断连,断联后需要重开服务器:需要再发一遍

AT+CIPMUX=1,AT+CIPSERVER=1,8080

4)设置超时时间s为单位,(开启服务器后才能设置)

AT+CIPSTO=2880

服务器超时时间,0~2880,单位为 s

5)然后电脑连接ESP8266-01S

此处网络为配置AP时设置的名称和密码,我们此处举例为ESP_01S;12345678,电脑连接模块的WIFI,然后通过 fireTools.exe调试助手连接TPC服务器(模块)

串口助手 软件工具等(下载工具),在TCP网络调试菜单进行调试
链接:百度网盘 请输入提取码    提取码:3p7y

协议类型表示上位机使用端的类型,为客户机;服务器ip即esp8266-01s的ip,默认为192.168.4.1,端口为自己配置的8080。esp8266的配置可通过AT+CWSAP?命令查看,esp8266的IP可通过AT+CIFSR查看。

如图,连接和断连都会显示

6)查看当前的设备

AT+CIPSTATUS

返回:STATUS: + CIPSTATUS:,,,,

  • :连接的 id 号 0-4
  • :字符串参数,类型 TCP 或 UDP
  • :字符串参数,IP 地址
  • :端口号
  • : 0-本模块做 client 的连接,1-本模块做 server 的连接

7)向连接设备发送数据

AT+CIPSEND=0,6(设置指令) (通过上一条指令 AT+CIPSTATUS 得知 ID=0)

1)单路连接时(+CIPMUX=0),指令为:AT+CIPSEND=

2)多路连接时(+CIPMUX=1) (Server模式),指令为:AT+CIPSEND= 0,6

多路连接参数1:0表示多路连接的设备0

多路连接参数2:6表示向指定设备发送6Byte数据,若发送字节数小于6,则在发送数据结尾每次会自动补充0D 0A,直到足够6Byte。若发送字节数大于6,则截取前6BYTE。最大长度为 2048。

ESP8266收到此命令后先换行返回”>”,然后开始接收串口数据

1是电脑调试助手发送给ESP8266的数据,发了两次,

发送完毕ESP826601S会返回Recv 6 bytes SEND OK,如果未建立连接或连接被断开,返回 ERROR

8)接收数据

从设备(电脑模拟的),可直接发送数据,接收到

发送接收也可以使用ASIIC,一个汉字占2BYTE(好像是)

2.2.3 Client收发数据方法-----------------------------------------------------------------------------------------
1)关闭Server服务器(不管之前开没开启过,都可以走一下这个流程)

AT+CIPSERVER=0

指令:AT+CIPSERVER=[,]                 

说明::0-关闭 server 模式,1-开启 server 模式

:端口号,缺省值为 333

响应:OK

说明:(1) AT+ CIPMUX=1 时才能开启服务器;关闭 server 模式需要重启

(2)开启 server 后自动建立 server 监听,当有 client 接入会自动按顺序占用一个连

接。

AT+RST重启一下

2)使用其他设备或调试助手创建服务器,示例使用fireTools.exe

3)开启多路连接模式(一个客户机(esp826601s)可以连接多个服务器)

AT+CIPMUX=1

0-单路连接模式,1-多路连接模式

4)建立TCP连接

AT+CIPSTART=0,"TCP","192.168.4.2",8080

表示建立id为0的TCP连接,后面是服务器ip和端口号

指令:

1)单路连接时(+CIPMUX=0),指令为:AT+CIPSTART= ,,

2)多路连接时(+CIPMUX=1),指令为:AT+CIPSTART=,,,

响应:

如果格式正确且连接成功,返回 OK,否则返回 ERROR

如果连接已经存在,返回 ALREAY CONNECT

说明:

0-4,连接的 id 号

字符串参数,表明连接类型,”TCP”-建立 tcp 连接,”UDP”-建立 UDP 连接

字符串参数,远程服务器 IP 地址

远程服务器端口号

5)向服务器发送数据

AT+CIPSEND=0,10(通过上一条指令 AT+CIPSTART 设置为 ID=0)

指令:

1)单路连接时(+CIPMUX=0),指令为:AT+CIPSEND=

2)多路连接时(+CIPMUX=1) ,指令为: AT+CIPSEND=  , 

响应:

收到此命令后先换行返回”>”,然后开始接收串口数据

每次发送会自动补0D、0A,当数据长度满 length 时发送数据。

如果未建立连接或连接被断开,返回 ERROR

如果数据发送成功,返回 SEND OK

说明:

需要用于传输连接的 id 号 0-4

数字参数,表明发送数据的长度,最大长度为 2048

2.3. 其他常用指令
  • 重启 ESP8266
AT+RST
  • 设置无回显模式(有时需要):
ATE0
  • 恢复工厂设置

AT+RESTORE

二、实际操作

1、ESP8266配置

1.1使用安可信助手连接ESP8266模块(方法见上一文章,需要烧写固件等)

1.2指令配置

1、AT,测试


2、AT+CWMODE=2,AP模式配置

3、AT+RST,复位

4、AT+CWSAP="Your_AP_Name","Your_Password",1,3      ,配置ESP8266的WIFI热点名称和密码

  • Your_AP_Name: 自定义的热点名称。
  • Your_Password: 热点的 Wi-Fi 密码(8 到 64 个字符)。
  • 5: 信道,值从 1 到 13。选择一个不冲突的信道。
  • 3: 安全模式(0:开放,1:WEP,2:WPA-PSK,3:WPA2-PSK,4:WPA/WPA2-PSK)。

5、AT+CIPMUX=1 ,开启多连接模式

6、AT+CIPSERVER=1,a (为端口号,默认333),ESP8266-01S作为server进行连接

  • 0-关闭 server 模式,1-开启 server 模式
  • 端口号,缺省值为 333

9、完成以上指令后,基本上就设置完成了,当用手机app连接时,app随便下一个网络调试助手就行,选择TCP客户端,连接时需要8266模块的ip,和之前设置的端口,默认端口为333,模块的ip可以通过指令查询:AT+CIFSR

一般默认192.168.4.1

2、手机作为客户端进行连接,当用手机app连接时,app随便下一个网络调试助手就行

若与与手机端在一定时间内不通信,则模块会断开此连接,默认为3分钟。

2.1、设置超时时间

2.2、连接

手机直接连接刚才创建的服务器,和指定的端口,通过

多路连接,连接的通断会显示,好像是0-4通道,默认从0开始

通过指令可以查看当前连接的设备通道和ip和端口等。

AT+CIPSTATUS

返回:STATUS: + CIPSTATUS:,,,,

  • :连接的 id 号 0-4
  • :字符串参数,类型 TCP 或 UDP
  • :字符串参数,IP 地址
  • :端口号
  • : 0-本模块做 client 的连接,1-本模块做 server 的连接​​​​​​​​​​​​​​

2.3、收发

手机直接发送,ESP826601S可以接收到

ESP接收到数据

ESP826601S发送:

 AT+CIPSEND=0,6

多路连接参数1:0表示多路连接的设备0

多路连接参数2:6表示向指定设备发送6Byte数据,若发送字节数小于6,则在发送数据结尾每次会自动补充0D 0A,直到足够6Byte。若发送字节数大于6,则截取前6BYTE。最大长度为 2048。下图发送的两次1。

ESP8266收到此命令后先换行返回”>”,然后开始接收串口数据

1是电脑调试助手发送给ESP8266的数据,发了两次,

发送完毕ESP826601S会返回Recv 6 bytes SEND OK,如果未建立连接或连接被断开,返回 ERROR

测试完成表明连接已经成功,功能无异常!

三、ESP8266-01S----STM32----手机

以STM32串口3为例

  • 串口3,esp8266模块连接串口3资源
  • 定时器5,为什么使用定时器?在esp8266接受数据产生中断时,因为我们并不知道接收的有多少数据,什么时候接收结束,所以采用一个定时器,当定时器清零前下一个数据到来表示是连续数据,重置定时器,若定时器时间到了还没有接收到下一条数据则表示数据接收完成,可进入定时器中断服务程序进行数据处理,添加接收完成标志位,如下代码

定时器5初始化:


#include "timer5.h"
extern u8 start3;//串口中断接收完成标志//定时器5中断服务程序		    
void TIM5_IRQHandler(void)
{ 	if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)//是更新中断{	 			   start3=1;	//标记串口数据接收完成TIM_ClearITPendingBit(TIM5, TIM_IT_Update  );  //清除TIM5更新中断标志    TIM_Cmd(TIM5, DISABLE);  //关闭TIM5}	    
}//通用定时器中断初始化
//这里始终选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数		 
void TIM5_Int_Init(u16 arr,u16 psc)
{	NVIC_InitTypeDef NVIC_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);//TIM7时钟使能    //定时器TIM7初始化TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE ); //使能指定的TIM5中断,允许更新中断NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		//子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器}

串口3初始化:

//初始化IO 串口3
//bound:波特率	  void usart3_init(u32 bound)
{  USART_InitTypeDef USART_InitStructure;  NVIC_InitTypeDef NVIC_InitStructure;   GPIO_InitTypeDef GPIO_InitStructure;    //声明一个结构体变量,用来初始化GPIO  //使能串口的RCC时钟  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //使能UART3所在GPIOB的时钟  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);  //串口使用的GPIO口配置  // Configure USART3 Tx (PB.10) as alternate function push-pull  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  GPIO_Init(GPIOB, &GPIO_InitStructure); // Configure USART3 Rx (PB.11) as input floating    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  GPIO_Init(GPIOB, &GPIO_InitStructure);   //串口中断配置  //Configure the NVIC Preemption Priority Bits     // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  // Enable the USART3 Interrupt   NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;        //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  NVIC_Init(&NVIC_InitStructure);  //配置串口  USART_InitStructure.USART_BaudRate = bound;  USART_InitStructure.USART_WordLength = USART_WordLength_8b;  USART_InitStructure.USART_StopBits = USART_StopBits_1;  USART_InitStructure.USART_Parity = USART_Parity_No;  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  // Configure USART3   USART_Init(USART3, &USART_InitStructure);//配置串口3 // Enable USART3 Receive interrupts 使能串口接收中断  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);  // Enable the USART3   USART_Cmd(USART3, ENABLE);//使能串口3  USART_ClearFlag(USART3, USART_FLAG_TC);		TIM5_Int_Init(1000-1,8400-1);		//100ms中断TIM_Cmd(TIM5, DISABLE); //关闭定时器7}

串口3中断处理函数:

//定义接收数组,接收缓冲,最大USART3_MAX_RECV_LEN个字节,宏定义为400
unsigned char USART3_RX_BUF[USART3_MAX_RECV_LEN]; 				
u16 USART3_RX_STA=0;  //数组标志位
u8 start3=0; //接收状态标志位
void USART3_IRQHandler(void)
{u8 res;	 if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据{	 res =USART_ReceiveData(USART3);	TIM_SetCounter(TIM5,0);//计数器清空        				 		TIM_Cmd(TIM5, ENABLE);  //使能定时器5  		USART3_RX_BUF[USART3_RX_STA]=res;		//记录接收到的值USART3_RX_STA++; 						 
}  
}

串口3发送字符串函数:

//串口3,printf 函数
//确保一次发送数据不超过USART3_MAX_SEND_LEN字节
void u3_printf(char* fmt,...)  
{  u16 i,j;va_list ap;va_start(ap,fmt);vsprintf((char*)USART3_TX_BUF,fmt,ap);va_end(ap);i=strlen((const char*)USART3_TX_BUF);//此次发送数据的长度for(j=0;j<i;j++)//循环发送数据{while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);  //等待上次传输完成 USART_SendData(USART3,(uint8_t)USART3_TX_BUF[j]); 	 //发送数据到串口3 }}

esp8266初始化:

//清空每次中断接收完成后的数组
void Clear_Buffer(void)//清空缓存
{u8 i;for(i=0;i<=USART3_RX_STA;i++)USART3_RX_BUF[i]=0;//缓存USART3_RX_STA=0;Delay_ms(100);
}//模块初始化
void esp8266_start_trans(void)
{esp8266_send_cmd("AT+CWMODE=2","OK",50);Clear_Buffer();//Wifi模块重启esp8266_send_cmd("AT+RST","OK",20);Delay_ms(1000);         //延时3S等待重启成功Delay_ms(1000);Delay_ms(1000);	//AP模式esp8266_send_cmd("AT+CWSAP=\"想学ESP8266吗\",\"12345678\",11,3","OK",200);Clear_Buffer();esp8266_send_cmd("AT+CIPMUX=1","OK",20);Clear_Buffer();esp8266_send_cmd("AT+CIPSERVER=1","OK",200);Clear_Buffer();}	u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{u8 res=0; USART3_RX_STA=0;u3_printf("%s\r\n",cmd);	//发送命令printf("%s\r\n",cmd);Delay_ms(waittime);if(strstr((const char*)USART3_RX_BUF,"OK")){Uart1_SendStr((char*)USART3_RX_BUF);}return res;
}

主函数main:

extern u8 start3;extern unsigned char USART3_RX_BUF[USART3_MAX_RECV_LEN]; int main ( void )
{/* 初始化 */USART1_Config ();usart3_init(115200);  CPU_TS_TmrInit();	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);  	esp8266_start_trans();                                                      while ( 1 ){if(start3==1)//接收中断完成标志位{//判断接收的数据是否为密码数据,自己设置就行if(strstr((const char*)USART3_RX_BUF,"12345678")){		printf("开门成功\r\n");	}								if(!strstr((const char*)USART3_RX_BUF,"12345678")){printf("密码错误\r\n");	}				Clear_Buffer();		start3=0;}}
}

相关文章:

ESP8266-01S、手机、STM32连接

1、ESP8266-01S的工作原理 1.1、AP和STA ESP8266-01S为WIFI的透传模块&#xff0c;主要模式如下图&#xff1a; 上节说到&#xff0c;我们需要用到AT固件进行局域网应用&#xff08;ESP8266连接的STM32和手机进行连接&#xff09;。 ESP8266为一个WiFi透传模块&#xff0c;和…...

微服务学习:基础理论

一、微服务和应用现代化 1、时代的浪潮&#xff0c;企业的机遇和挑战 在互联网化数字化智能化全球化的当今社会&#xff0c;IT行业也面临新的挑战&#xff1a; 【快】业务需求如“滔滔江水连绵不绝”&#xff0c;企业需要更快的交付【变】林子大了&#xff0c;百色用户&…...

【c++继承篇】--继承之道:在C++的世界中编织血脉与传承

目录 引言 一、定义二、继承定义格式2.1定义格式2.2继承关系和访问限定符2.3继承后子类访问权限 三、基类和派生类赋值转换四、继承的作用域4.1同名变量4.2同名函数 五、派生类的默认成员构造函数5.1**构造函数调用顺序&#xff1a;**5.2**析构函数调用顺序&#xff1a;**5.3调…...

Java操作Excel导入导出——POI、Hutool、EasyExcel

目录 一、POI导入导出 1.数据库导出为Excel文件 2.将Excel文件导入到数据库中 二、Hutool导入导出 1.数据库导出为Excel文件——属性名是列名 2.数据库导出为Excel文件——列名起别名 3.从Excel文件导入数据到数据库——属性名是列名 4.从Excel文件导入数据到数据库…...

基于VSCODE+GDB+GDBSERVER远程单步调试设备篇(可视化界面)

目录 说明 配置方法 1&#xff09;VSCODE必备插件 2&#xff09;配置launch.json文件&#xff0c;用于GDB调试 调试步骤 ​​​​​​目标板运行程序 1&#xff09;已启动程序&#xff0c;通过attach方式进入调试 2&#xff09;通过gdbserver启动时加载程序(程序路径根据实际情…...

【设计模式】 单例模式(单例模式哪几种实现,如何保证线程安全,反射破坏单例模式)

单例模式 作用&#xff1a;单例模式的核心是保证一个类只有一个实例&#xff0c;并且提供一个访问实例的全局访问点。 实现方式优缺点饿汉式线程安全&#xff0c;调用效率高 &#xff0c;但是不能延迟加载懒汉式线程安全&#xff0c;调用效率不高&#xff0c;能延迟加载双重检…...

lvm快照备份

前提 数据文件要在逻辑卷上&#xff1b; 此逻辑卷所在卷组必须有足够空间使用快照卷&#xff1b; 数据文件和事务日志要在同一个逻辑卷上&#xff1b; 前提&#xff1a;MySQL数据lv和将要创建的快照要在同一vg&#xff0c;vg要有足够的空间存储 优点 几乎是热备&…...

PHP CRM售后系统小程序

&#x1f4bc; CRM售后系统 &#x1f4fa;这是一款基于PHP和uniapp深度定制的CRM售后管理系统&#xff0c;它犹如企业的智慧核心&#xff0c;精准赋能销售与售后管理的每一个环节&#xff0c;引领企业步入精细化、数字化的全新管理时代。系统集成了客户管理、合同管理、工单调…...

ETL 数据抽取

ETL ETL 数据抽取 ETL&#xff08;Extract, Transform, Load&#xff09;是数据集成和处理的重要过程&#xff0c;其中数据抽取&#xff08;Extract&#xff09;是第一步&#xff0c;负责从各种数据源中提取数据。以下是ETL数据抽取的详细说明和常用工具&#xff1a; 1. 数据…...

FANUC机器人系统镜像备份与恢复的具体步骤(图文)

FANUC机器人系统镜像备份与恢复的具体步骤(图文) 镜像备份: 如下图所示,进入文件—工具—切换设备,找到插入的U盘UT1, 如下图所示,进入U盘目录后,创建目录,这里目录名称为11, 如下图所示࿰...

MindsDB - 构建企业数据源 AI 对话

一、关于 MindsDB MindsDB是世界上最有效的解决方案&#xff0c;用于构建与混乱的企业数据源对话的AI应用程序。把它想象成图书管理员Marie Kondo。 github : https://github.com/mindsdb/mindsdb官网&#xff1a;https://www.mindsdb.com/官方文档&#xff1a;https://docs.…...

正则表达式(python版最全面,最易懂)

正则表达式 正则表达式英文称regular expression 定义&#xff1a;正则表达式是一种文本模式匹配的工具&#xff0c;用于字符串的搜索&#xff0c;匹配和替换。在excel,word以及其他的文本编辑器都可直接适配。 一、基本匹配规则 字面值字符&#xff1a;例如字母、数字、空格…...

QT 使用QTableView读取数据库数据,表格分页,跳转,导出,过滤功能

文章目录 效果图概述功能点代码分析导航栏表格更新视图表格导出表格过滤 总结 效果图 概述 本案例用于对数据库中的数据进行显示等其他操作。数据库的映射&#xff0c;插入等功能看此博客框架&#xff1a;数据模型使用QSqlTableModel&#xff0c;视图使用QTableView&#xff0…...

golang标准库path/filepath使用示例

文章目录 前言一、常用方法示例1.将相对路径转换为绝对路径2.获取路径中最后一个元素3.获取路径中除去最后一个元素的部分4.路径拼接5.将路径拆分为目录和文件名两部分6.返回一个相对路径7.文件路径遍历8.根据文件扩展名过滤文件9.使用正则表达式进行路径匹配 前言 path/filep…...

【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析

【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础&#xff0c;提供集中日志记录和分析&#xff0c;以及端到端可见性。因此&#xff0c;分析师可以更有效地管理安全状态&#xff0c;将安全流程自动化&#xff0c;并快速响应威胁。具有分析和自动化功能的集成…...

12 分布式事务

分布式事务产生的原因 我们拿mysql数据库来说&#xff0c;当数据库为单体数据库的时候&#xff0c;我们打开事务&#xff0c;执行sql为预执行阶段&#xff0c;最后commit时通过日志控制最终全部提交后存储到磁盘中&#xff0c;如果commit失败&#xff0c;可以通过日志控制回滚…...

移远通信多模卫星通信模组BG95-S5获得Skylo网络认证,进一步拓展全球卫星物联网市场

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信正式宣布&#xff0c;其支持“卫星蜂窝”多模式的高集成度NTN卫星通信模组BG95-S5已成功获得NTN网络运营商Skylo的网络认证。BG95-S5也成为了获得该认证的最新款移远卫星通信模组。 BG95-S5模组顺利获得Skylo认证&a…...

51.WPF应用加图标指南 C#例子 WPF例子

完整步骤&#xff1a; 先使用文心一言生成一个图标如左边使用Windows图片编辑器编辑&#xff0c;去除背景使用正方形&#xff0c;放大图片使图标铺满图片使用格式工程转换为ico格式&#xff0c;分辨率为最大 在资源管理器中右键项目添加ico类型图片到项目里图片属性设置为始终…...

OpenEuler学习笔记(三):为什么要搞OpenEuler?

为什么要搞OpenEuler&#xff1f; 技术自主可控需求 在信息技术领域&#xff0c;操作系统是关键的基础软件。过去&#xff0c;很多关键技术被国外厂商掌控&#xff0c;存在技术“卡脖子”的风险。OpenEuler的出现可以为国内提供一个自主可控的操作系统选择。例如&#xff0c;在…...

Apache Hive--排序函数解析

在大数据处理与分析中&#xff0c;Apache Hive是一个至关重要的数据仓库工具。其丰富的函数库为数据处理提供了诸多便利&#xff0c;排序函数便是其中一类非常实用的工具。通过排序函数&#xff0c;我们能够在查询结果集中为每一行数据分配一个排名值&#xff0c;这对于数据分析…...

LLMs之Dataset:中文互联网基础语料2.0的简介、下载和使用方法、案例应用之详细攻略

LLMs之Dataset&#xff1a;中文互联网基础语料2.0的简介、下载和使用方法、案例应用之详细攻略 目录 中文互联网基础语料2.0的简介 1、特点 中文互联网基础语料2.0的下载和使用方法 中文互联网基础语料2.0的案例应用 中文互联网基础语料2.0的简介 2025年1月发布&#xff0…...

深入剖析iOS网络优化策略,提升App性能

一、引言 在当今移动互联网时代&#xff0c;iOS 应用的网络性能直接关系到用户体验。无论是加载速度缓慢、频繁的网络错误&#xff0c;还是高额的流量消耗&#xff0c;都可能导致用户流失。因此&#xff0c;iOS 网络优化成为开发者提升应用质量、增强用户满意度的关键环节。本文…...

unity2022以上导出到AndroidStudio后更新步骤

1、unity里面Export出unityLibrary 2、导出apk&#xff0c;里面才包含libil2cpp(新版unity无法直接导出libil2cpp 3、注释AS项目app下的build.gradle里面包含unityLibrary的代码 4、注释AS项目settings.gradle包含unityLibrary的代码 5、删除AS项目里面的unityLibrary文件夹 6、…...

03JavaWeb——Ajax-Vue-Element(项目实战)

1 Ajax 1.1 Ajax介绍 1.1.1 Ajax概述 我们前端页面中的数据&#xff0c;如下图所示的表格中的学生信息&#xff0c;应该来自于后台&#xff0c;那么我们的后台和前端是互不影响的2个程序&#xff0c;那么我们前端应该如何从后台获取数据呢&#xff1f;因为是2个程序&#xf…...

表单中在不设置required的情况下在label前加*必填标识

参考:https://blog.csdn.net/qq_55798464/article/details/136233718 需求&#xff1a;在发票类型前面添加*必填标识 我最开始直接给发票类型这个表单类型添加了验证规则required:true&#xff0c;问题来了&#xff0c;这个发票类型它是有默认值的&#xff0c;所以我点击保存…...

Mac 使用 GVM 管理多版本 Go 环境

使用 GVM 管理多版本 Go 环境 在本文中&#xff0c;我们将使用 gvm&#xff08;Go Version Manager&#xff09;工具管理本地多个 Go 语言版本。gvm 功能类似于 Python 的 Anaconda&#xff0c;可以方便地切换不同版本的 Go 环境&#xff0c;非常适合需要多版本开发与测试的场…...

3DsMax设置中文界面

按键盘上的“Win”键&#xff0c;直接输入3dsmax&#xff0c;选择Simplified Chinese打开&#xff0c;之后就都是中文了...

【PyCharm】连接 Git

【PyCharm】相关链接 【PyCharm】连接 Git【PyCharm】连接Jupyter Notebook【PyCharm】快捷键使用【PyCharm】远程连接Linux服务器【PyCharm】设置为中文界面 要在 PyCharm 中连接 Git&#xff0c;确保您的开发环境已经安装了 Git&#xff0c;并且 PyCharm 能够访问它。 以下…...

使用Python和PIL裁剪图片以适应屏幕宽高比

在本教程中&#xff0c;我们将介绍如何使用Python和PIL&#xff08;Python Imaging Library&#xff09;库来裁剪图片&#xff0c;使其适应特定的屏幕宽高比。我们将详细解释代码的每个部分&#xff0c;并展示如何根据不同的裁剪模式来调整图片。 1. 安装PIL库 首先&#xff…...

Django简介与虚拟环境安装Django

目录 1.Django简介 1.1 Django 的核心特点 1.2 Django 的核心组件 1.3 Django 的应用场景 1.4 总结 2.基础环境建立 2.1 创建虚拟环境 2.1.1 使用 virtualenv 创建虚拟环境 2.1.2 使用 venv 创建虚拟环境 2.2 激活虚拟环境 2.2.1 在 Windows 上 2.2.2 在 macOS 或 …...

python实现pdf转word和excel

一、引言   在办公中&#xff0c;我们经常遇收到pdf文件格式&#xff0c;因为pdf格式文件不易修改&#xff0c;当我们需要编辑这些pdf文件时&#xff0c;经常需要开通会员或收费功能才能使用编辑功能。今天&#xff0c;我要和大家分享的&#xff0c;是如何使用python编程实现…...

Ubuntu 24.04 LTS 更改软件源

Ubuntu 24.04 LTS 修改软件源...

从CRUD到高级功能:EF Core在.NET Core中全面应用(三)

目录 IQueryable使用 原生SQL使用 实体状态跟踪 全局查询筛选器 并发控制使用 IQueryable使用 在EFCore中IQueryable是一个接口用于表示可查询的集合&#xff0c;它继承自IEnumerable但具有一些关键的区别&#xff0c;使得它在处理数据库查询时非常有用&#xff0c;普通集…...

浅谈云计算22 | Kubernetes容器编排引擎

Kubernetes容器编排引擎 一、Kubernetes管理对象1.1 Kubernetes组件和架构1.2 主要管理对象类型 二、Kubernetes 服务2.1 服务的作用与原理2.2 服务类型 三、Kubernetes网络管理3.1 网络模型与目标3.2 网络组件3.2.1 kube-proxy3.2.2 网络插件 3.3 网络通信流程 四、Kubernetes…...

C 语言的void*到底是什么?

一、void* 的类型任意性 void* 是一种通用指针类型。它可以指向任意类型的数据。例如&#xff0c;它可以指向一个整数&#xff08;int&#xff09;、一个浮点数&#xff08;float&#xff09;、一个字符&#xff08;char&#xff09;或者一个结构体等。在C语言中&#xff0c;当…...

前端【3】--CSS布局,CSS实现横向布局,盒子模型

盒子分类 1、块级盒子 2、内联级盒子 3、内联块级盒子 4、弹性盒子 5、盒子内部分区 方法一&#xff1a;使用 float 普通盒子实现横向布局 方法二&#xff1a;使用 display: inline-block 内联块级元素实现横向布局 方法三&#xff1a;使用弹性盒子 flexbox&#xff0…...

JavaEE

一.web开发概述 1.服务器 解释1&#xff1a;服务器是一款软件&#xff0c;可以向其他发送请求&#xff0c;服务器会做出一个响应。可以在服务器中部署文件&#xff0c;让其他人访问。 解释2&#xff1a;也可以把运行服务器软件的计算机称为服务器 2.安装服务器 Tomcat官方…...

C语言之文本加密程序设计

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 文本加密程序设计 摘要&#xff1a;本文设计了一种文本加密程序&#xff0c;旨在提高信息安…...

Spring-Data-Redis连接模式

Redis可以在各种设置中操作。每个操作模式都需要特定的配置&#xff0c;这些配置将在以下部分中进行解释。 一、Redis 单机模式 最简单的入门方法是将Redis Standalone与单个Redis服务器一起使用&#xff0c; 配置LettuceConnectionFactory或JedisConnectionFactor&#xff0…...

详细介绍下linux内核的高端地址

在32位系统中&#xff0c;内核空间通常占据1GB&#xff0c;用户空间占3GB&#xff0c;这主要是基于历史原因、内存管理需求和系统安全性考虑。 历史原因&#xff1a;早期的UNIX系统就采用了将内核空间和用户空间分离的设计&#xff0c;在32位系统设计时&#xff0c;延续了这种…...

ThinkPhp项目解决静态资源请求的跨域问题的解决思路

背景&#xff1a;我在前端使用vue语言开发的&#xff0c;请求的后端是用ThinkPhp项目开发的。我vue项目里的请求php接口&#xff0c;自带header参数的跨域问题通过网上查询到的server端配置方法已经解决了。我使用的 是中间件的配置方法&#xff1a; <?php//admin 项目 配…...

通过图形界面展现基于本地知识库构建RAG应用

1. 客户需求 快速完成概念验证(PoC)通过图形界面快速完成演示本地私有数据对比不同模型和成本&#xff0c;决定如何部署 2. 阿里云基于本地知识库构建RAG应用 参考方案&#xff1a; 百炼本地知识库方案 解决方案&#xff1a; FastAPI Gradio Llamaindex qwen-plus 主要三大…...

GCPAAS/DashBoard:完全免费的仪表盘设计,基于Vue+ElementUI+G2Plot+Echarts,开源代码,简单易用!还在等什么呢

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 GCPAAS/DashBoard&#xff0c;一款基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的仪表盘设计器&#xff0c;具备仪表盘目录管理…...

深度学习笔记——循环神经网络RNN

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络RNN知识点。 文章目录 文本特征提取的方法1. 基础方法1.1 词袋模型&#xff08;Bag of Words, BOW&#xff09;工作原…...

【Linux系统编程】—— 深度解析进程等待与终止:系统高效运行的关键

文章目录 进程创建再次认识fork()函数fork()函数返回值 写时拷贝fork常规⽤法以及调用失败的原因 进程终⽌进程终止对应的三种情况进程常⻅退出⽅法_exit函数exit函数return退出 进程等待进程等待的必要性进程等待的⽅法 进程创建 再次认识fork()函数 fork函数初识&#xff1…...

EPSANet2021笔记

来源&#xff1a; EPSANet: An Efficient Pyramid Squeeze Attention Block on Convolutional Neural Network 相关工作&#xff1a; #注意力机制 #多尺度特征表示 创新点&#xff1a; 贡献&#xff1a; 建立了长距离通道依赖关系有效获取利用不同尺度特征图的空间信息 问…...

CTTSHOW-WEB入门-信息搜集11-20

web11 1. 题目&#xff1a; 2. 解题步骤及思路&#xff1a;本题的flag已经给出&#xff0c;主要考点是考察域名的查询&#xff0c;通过查询有时候也可以得到一些有用的信息。 3. 相关知识点&#xff1a;查询域名可以使用nslookup命令使用方法如下&#xff1a;&#xff08;windo…...

2025年1月19日(理论力学动静法)

动静法&#xff08;Dynamic-Static Method&#xff09;是理论力学中常用的一种分析方法&#xff0c;用来求解多自由度系统的平衡问题&#xff0c;尤其适用于静力学分析和动力学分析之间的转化。动静法通过引入虚拟的动力学效应&#xff0c;将静力学问题转化为一个动力学问题&am…...

iOS 性能优化:实战案例分享

摘要&#xff1a; 本文将深入探讨 iOS 性能优化的重要性&#xff0c;并通过一系列实际开发案例&#xff0c;展示如何解决常见的性能问题&#xff0c;包括内存管理、CPU 性能、网络性能、UI 性能和启动性能等方面的优化&#xff0c;帮助 iOS 开发者打造更流畅、高效的应用程序。…...

基于本地消息表实现分布式事务

假设我们有一个电商系统,包含订单服务和库存服务。当用户下单时,需要在订单服务中创建订单,同时在库存服务中扣减库存。这是一个典型的分布式事务场景,我们需要保证这两个操作要么都成功,要么都失败,以保证数据的最终一致性。 项目结构: 订单服务(Order Service)库存服务(Inv…...