STM32驱动SIM900A短信模块

news2024/11/25 10:46:49

简介:STM32F103C8T6驱动SIM900A短信模块源码介绍。

开发平台:KEIL ARM

MCU型号:STM32F103C8T6

传感器型号:SIM900A

特别提示:驱动内可能使用了某些其他组件,比如delay等,在文末外设模板下载地址内有。

1积分源码下载地址在文末!!!

接口图:

使用举例:

#include <stdio.h>
#include "GSM_func.h"

int main()
{
	char mes[] = "this is message";
	uint8_t recMesID = 0;
	GSM_Init(); // 初始化
	GSM_sendMessage(mes);
	while(1) {
		// 接收到短信send:1
		if((recMesID = GSM_waitMessage()) != 0) {
			char val = GSM_readMessage(recMesID); // val = 1
			printf("rec mes val:%c\n", val);
		}
	}
}

驱动源码:

GSM_config.c

#include "main.h"


#if 0
#define  GSM_USARTx                   USART1
#define  GSM_USART_CLK                RCC_APB2Periph_USART1
#define  GSM_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  GSM_USART_BAUDRATE           9600

#define  GSM_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  GSM_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
    
#define  GSM_USART_TX_GPIO_PORT       GPIOA   
#define  GSM_USART_TX_GPIO_PIN        GPIO_Pin_9
#define  GSM_USART_RX_GPIO_PORT       GPIOA
#define  GSM_USART_RX_GPIO_PIN        GPIO_Pin_10

#define  GSM_USART_IRQ                USART1_IRQn
#define  GSM_USART_IRQHandler         USART1_IRQHandler

#else
#define  GSM_USARTx                   USART2
#define  GSM_USART_CLK                RCC_APB1Periph_USART2
#define  GSM_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  GSM_USART_BAUDRATE           9600
                                        
#define  GSM_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  GSM_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
                                        
#define  GSM_USART_TX_GPIO_PORT       GPIOA   
#define  GSM_USART_TX_GPIO_PIN        GPIO_Pin_2
#define  GSM_USART_RX_GPIO_PORT       GPIOA
#define  GSM_USART_RX_GPIO_PIN        GPIO_Pin_3
                                        
#define  GSM_USART_IRQ                USART2_IRQn
#define  GSM_USART_IRQHandler         USART2_IRQHandler
#endif

//	
char GSM_USART_RX_BUF[GSM_USART_MAX_RECV_LEN]; 				
char GSM_USART_TX_BUF[GSM_USART_MAX_SEND_LEN]; 				

// [14:0]: 接收字节数 [15]: 接收完成标志
volatile uint16_t GSM_USART_RX_STA = 0;   	

// GSM串口中断处理
void GSM_USART_IRQHandler(void)
{
	uint8_t res;	      
	if(USART_GetITStatus(GSM_USARTx, USART_IT_RXNE) != RESET)
	{	 
		res = USART_ReceiveData(GSM_USARTx);
		if((GSM_USART_RX_STA&(1<<15))==0)
		{ 
			if(GSM_USART_RX_STA<GSM_USART_MAX_RECV_LEN)
			{
				TIM_SetCounter(TIM3,0);
				if(GSM_USART_RX_STA==0) 
				{
					TIM_Cmd(TIM3,ENABLE);
				}
				GSM_USART_RX_BUF[GSM_USART_RX_STA++]=res;	
			}else 
			{
				GSM_USART_RX_STA|=1<<15;
			} 
		}
		USART_ClearITPendingBit(GSM_USARTx, USART_IT_RXNE);
	}  				 											 
}   
// TIM3中断处理
void TIM3_IRQHandler(void)
{ 	
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
	{	 			   
		GSM_USART_RX_STA|=1<<15;
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
		TIM_Cmd(TIM3, DISABLE); 
	}	    
}
/**
  * @brief  GSM 10ms定时器初始化
  * @param  None
  * @retval None
  * @note   用于检测GSM串口接收状态
*/
void GSM_TIM3_Init(void)
{	
	NVIC_InitTypeDef NVIC_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	TIM_DeInit(TIM3);
	TIM_TimeBaseStructure.TIM_Period = 1000-1; 
	TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; 
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
	TIM_Cmd(TIM3,DISABLE);

	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}
/**
  * @brief  GSM 串口初始化
  * @param  bound: 波特率
  * @retval None
  * @note   None
*/
void GSM_USART_Init(uint32_t bound)
{  
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	GSM_USART_GPIO_APBxClkCmd(GSM_USART_GPIO_CLK, ENABLE);
	GSM_USART_APBxClkCmd(GSM_USART_CLK,ENABLE);

 	USART_DeInit(GSM_USARTx); 
	//USART_TX
	GPIO_InitStructure.GPIO_Pin = GSM_USART_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GSM_USART_TX_GPIO_PORT, &GPIO_InitStructure);
	//USART_RX
	GPIO_InitStructure.GPIO_Pin = GSM_USART_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GSM_USART_RX_GPIO_PORT, &GPIO_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;	
	USART_Init(GSM_USARTx, &USART_InitStructure);
	
	USART_Cmd(GSM_USARTx, ENABLE);
	USART_ITConfig(GSM_USARTx, USART_IT_RXNE, ENABLE);
	
	NVIC_InitStructure.NVIC_IRQChannel = GSM_USART_IRQ;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);	//
	
	GSM_USART_RX_STA=0;
}

GSM_config.h

#ifndef __GSM_CONFIG_H
#define __GSM_CONFIG_H	 

#include "main.h"

#define GSM_USART_MAX_RECV_LEN		128		//	接收缓存大小
#define GSM_USART_MAX_SEND_LEN		32		//  发送缓存大小
#define GSM_USART_RX_EN 			1		//  接收使能标志

#define  GSM_USARTx 				USART2

extern char  GSM_USART_RX_BUF[GSM_USART_MAX_RECV_LEN]; 
extern char  GSM_USART_TX_BUF[GSM_USART_MAX_SEND_LEN];
extern volatile uint16_t GSM_USART_RX_STA; // 接收数据状态

void GSM_USART_IRQHandler(void);
void TIM3_IRQHandler(void);
void GSM_TIM3_Init(void);
void GSM_USART_Init(uint32_t bound);

#endif

GSM_func.c

#include "main.h"
 C lib
//#include <stdlib.h>
//#include <string.h>
//#include <stdio.h>
 system
//#include "delay.h"
// GSM
#include "GSM_config.h"


static char* GSM_check_cmd(char *str);
static void GSM_sendData(char* fmt,...);

// GSM信息
const char* GSM_phoneNum = "19198022169";
const char* GSM_head = "send:";

/**
  * @brief  向GSM串口发送数据
  * @param  fmt: 类似printf的数据格式
  * @retval None
  * @note   None
  */
void GSM_sendData(char* fmt,...)  
{  
	uint16_t i,j; 
	va_list ap; 
	va_start(ap,fmt);
	vsprintf((char*)GSM_USART_TX_BUF,fmt,ap);
	va_end(ap);
	i = strlen((const char*)GSM_USART_TX_BUF);		
	for(j=0; j<i; j++)						
	{
	  while(USART_GetFlagStatus(GSM_USARTx,USART_FLAG_TC)==RESET); 
		USART_SendData(GSM_USARTx,GSM_USART_TX_BUF[j]); 
	} 
}
/**
  * @brief  检测应答
  * @param  str: 期待的应答结果
  * @retval 0: 没有接收到期待应答
  * @retval !0: 其他值代表期待应答结果的位置
  * @note   None
  */
static char* GSM_check_cmd(char *str)
{
	char *strx=0;
	// 接收到一次数据了
	if(GSM_USART_RX_STA&0X8000)		
	{ 
		// 添加结束符
		GSM_USART_RX_BUF[GSM_USART_RX_STA&0X7FFF]=0;
		// 检索字符串
		strx=strstr(GSM_USART_RX_BUF,str);
		#ifdef DEBUG_printf
		printf("rec data: %s\n",GSM_USART_RX_BUF);
		#endif
	} 
	return strx;
}
/**
  * @brief  向GSM发送命令
  * @param  cmd: 发送的命令字符串
  * @param	ack: 期待的应答结果,如果为空,则表示不需要等待应答
  * @param	waittime: 等待时间(单位:10ms)
  * @retval 0: 发送成功(得到了期待的应答结果), 
  * @retval	1: 发送失败
  * @note   None
  */
char GSM_send_cmd(char *cmd,char *ack,uint16_t waittime)
{
	char res=0; 
	GSM_USART_RX_STA=0;
	//发送命令
	GSM_sendData("%s",cmd);	
	if(ack&&waittime)		//需要等待应答
	{
		while(--waittime)	//等待倒计时
		{
			DELAYClass.DelayMs(10);
			if(GSM_USART_RX_STA&0X8000)//接收到期待的应答结果
			{
				if(GSM_check_cmd(ack) != ((void *)0))
				{
					break; // 得到有效数据 
				}
				GSM_USART_RX_STA=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
} 
/**
  * @brief  string转换int
  * @param  *str:字符串地址
  * @retval 返回int型
  * @note   None
  */
int stringToInt(char *str)
{
	char *p = str;
	int nNUM = 0;
	
	while (*p >= '0' && *p <= '9')
	{
		nNUM = nNUM * 10 + (*p - '0');
		p++;
	}
	return nNUM;
}
/**
  * @brief  发送短信
  * @param  None
  * @retval None
  */
void GSM_sendMessage(char *message)
{
	char p[40];

	#ifdef DEBUG_printf
	printf("0. AT+CPIN?\n");
	#endif
	while(GSM_send_cmd("AT+CPIN?\r\n","OK",100));		// 查询卡状态
	#ifdef DEBUG_printf
	printf("1. AT+CMGF=1\n");
	#endif
	while(GSM_send_cmd("AT+CMGF=1\r\n","OK",100));		// 设置TXT模式
	#ifdef DEBUG_printf
	printf("2. AT+CMGS=\n");
	#endif
	sprintf((char*)p,"AT+CMGS=\"%s\"\r\n",GSM_phoneNum); // 设置目标手机号
	while(GSM_send_cmd(p,">",100));  
	DELAYClass.DelayMs(50);
	#ifdef DEBUG_printf
	printf("3. %s\n",message);
	#endif
	sprintf((char*)p,"%s\r\n",message); // 设置发送内容
	GSM_send_cmd(p,">",100);  
	DELAYClass.DelayMs(50);
	#ifdef DEBUG_printf
	printf("4. %x\n", 0x1A);
	#endif
	USART_SendData(USART2, 0x1A); // 确认发送
}
/**
  * @brief  等待接收短信
  * @param  None
  * @retval 0:无短信,!0:接收到的短信的存放地址
  */
uint8_t GSM_waitMessage(void)
{
	// 接收到一次数据了
	if(GSM_USART_RX_STA&0X8000)		
	{ 
		GSM_USART_RX_BUF[GSM_USART_RX_STA&0X7FFF]=0; // 添加结束符
#ifdef DEBUG_printf
		printf("(waitMes)%s\n", GSM_USART_RX_BUF);
#endif		
		char *strx = 0;
		// 检索字符串  含有"SM",则代表接收到短信
		strx=strstr(GSM_USART_RX_BUF,"\"SM\",");
		// 返回不为空则检索到指定字符串
		if(strx != ((void *)0))
		{
#ifdef DEBUG_printf
			printf("message rec success, addr : %d\n", stringToInt(strx+5));
#endif
			uint8_t addrNum = stringToInt(strx+5); // 将地址号保存
			GSM_USART_RX_STA = 0; // 清除接收标记
			return addrNum;
		}
		GSM_USART_RX_STA = 0;
	} 
	return 0;
}
/**
  * @brief  查看短信
  * @param  None
  * @retval 返回帧头后的一个字节数据
  */
char GSM_readMessage(uint8_t addrNum)
{
	char pp[40];
	uint8_t i = 0;
	sprintf((char*)pp,"AT+CMGR=%d\r\n",addrNum); // 查看该地址下的短信
	GSM_USART_RX_STA = 0;
	// 等待2s
	for(i = 0; i <= 200; i++) 
	{
		if(i % 50 == 0) // 每0.5s重发一次
		{
#ifdef DEBUG_printf
			printf("i = %d\n", i);
#endif
			GSM_sendData("%s", pp);
		}
		DELAYClass.DelayMs(10);
		if(GSM_USART_RX_STA&0X8000)		
		{ 
			// 添加结束符
			GSM_USART_RX_BUF[GSM_USART_RX_STA&0X7FFF]=0;
#ifdef DEBUG_printf
			printf("(readMes)%s\n", GSM_USART_RX_BUF);
#endif
			char *strx = 0;
			// 检索字符串  含有"send:",则代表查看短信成功
			strx=strstr(GSM_USART_RX_BUF,GSM_head);
			// 返回不为空则检索到指定字符串
			if(strx != ((void *)0))
			{
#ifdef DEBUG_printf
				printf("message read success, cmd : %c\n", strx[5]);
#endif
				char cmd = 0;
				cmd = strx[5]; // 此处可根据需求修改 当前是返回的send:后的一个字节
				GSM_USART_RX_STA = 0; // 清除接收标记
				DELAYClass.DelayMs(10);
				sprintf((char*)pp,"AT+CMGD=%d\r\n",addrNum); // 删除该地址下的短信
				GSM_sendData("%s", pp);
				return cmd;
			}
			GSM_USART_RX_STA = 0;
		}
	}
	GSM_USART_RX_STA = 0;
	return 0;
}
/**
  * @brief  GSM初始化
  * @param  None
  * @retval None
  * @note   None
	*/
void GSM_Init(void)
{
	GSM_USART_Init(9600);
	GSM_TIM3_Init();
}

GSM_func.h

#ifndef __GSM_FUNC_H
#define __GSM_FUNC_H

#include "main.h"


char GSM_send_cmd(char *cmd,char *ack,uint16_t waittime);
int stringToInt(char *str);
void GSM_sendMessage(char *message);
uint8_t GSM_waitMessage(void);
char GSM_readMessage(uint8_t addrNum);
void GSM_Init(void);

#endif

驱动下载地址:

https://download.csdn.net/download/m0_50669075/87672911

STM32工程模板、外设模板、模块模板下载地址:

stm32_template: STM32F103工程模板,外设模板,模块模板。模块模板包括:DHT11温湿度传感器,OLED屏幕,DS18B20温度传感器,DS1302时钟模块,红外测温模块,RFID模块,SIM900A短信模块,OneNET入网,ADXL345三轴传感器,离线语音识别模块,语音播报模块,甲醛传感器,PM2.5模块,SG90舵机,健康检测模块,消息队列示例,链表示例,分时调度系统示例等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

协议篇之以太网协议基础概念

协议篇之以太网协议基础概念一、写在前面二、什么是以太网三、以太网TCP/IP协议分层四、MAC地址与IP地址五、写在后面一、写在前面 在学习了串口协议后&#xff0c;发现通过串口传输数据&#xff0c;数据传输的速率较慢&#xff0c;无法符合高速率传输场景下的要求&#xff0c;…

PXE+Kickstart自动化安装操作系统

文章目录PXEKickstart 完美自动化部署系统理论知识&#xff1a;1、PXE2、DHCP实践实验&#xff1a;1、DHCP服务器配置2、TFTP服务器配置3、HTTP服务器安装4、PXE配置5、Kickstart实践配置PXEKickstart 完美自动化部署系统 理论知识&#xff1a; 无人值守原理&#xff1a;Kick…

飞行机器人专栏(十一)-- 空中机器人综合健康管理系统

目录 一. 综合健康管理系统架构 1. 系统架构&#xff1a; 2. 故障诊断算法&#xff1a; 3. 预测维护策略&#xff1a; 4. 安全与隐私&#xff1a; 5. 用户友好性&#xff1a; 6. 模块化与可扩展性&#xff1a; 7. 与其他系统集成&#xff1a; 8. 考虑环境因素&#xf…

获取文件内容方法使用说明

一、是什么&#xff1f; sikuli设备新增了一个获取文件内容的方法&#xff0c;该方法可以传入指定路径读取文件内容&#xff0c;方便后续做打印&#xff0c;对比等工作 二、怎么用&#xff1f; 1.文件绝对路径&#xff0c;例如 windows&#xff1a;F:\cn_sonic\sonic-agent…

abbyy finereader15下载安装使用及功能介绍

今天给大家分享一款一款真正的专业OCR&#xff0c;它不仅支持多国文字&#xff0c;还支持彩色文件识别、自动保留原稿插图和排版格式以及后台批处理识别功能&#xff0c;使用者再也不用在扫描软件、OCR、WORD、EXCEL之间换来换去了&#xff0c;处理文件会变的就像打开已经存档的…

RabbitMQ安装教程(Mac)

1、RabbitMQ是采用Erlang语言开发的&#xff0c;所以系统环境必须提供Erlang环境。 brew install rabbitmq前提必须是mac安装了HomeBrew&#xff08;软件包管理系统&#xff09;&#xff0c;以下都是基于mac版本的。 等大概十几分钟 brew services start rabbitmq;RabbitMQWeb…

第09章_性能分析工具的使用

第09章_性能分析工具的使用 ​ 在数据库调优过程中&#xff0c;我们的目标就是响应时间更快&#xff0c;吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮我们快速找到调优思路和方式。 1. 数据库服务器的优化步骤 ​ 当我们遇到数据库调优问题的时候&#xff0c;该如…

Rabbitmq学习笔记教程-尚硅谷

Rabbitmq学习笔记 &#xff08;尚硅谷&#xff09; 尚硅谷 rabbitmq 教程 1.MQ 的概念 1.1 什么是 MQ? 存放消息的队列&#xff0c;互联网架构中常见的一种服务与服务之间通信的方式。 1.2 为什么要用 MQ? 三大好处&#xff0c;削峰&#xff0c;解耦&#xff0c;异步。…

1小时学会CSS - 中

接第一课&#xff0c; 1小时学会CSS - 上&#xff0c;大家还记得前面说的一个概念&#xff0c;CSS 层叠样式吗&#xff1f;很多小伙伴都无法理解。 这里再详细说说&#xff0c;什么是CSS 层叠样式&#xff1f;CSS 层叠样式指的是上级标签的样式会自动继承给其所有的下级标签。…

爬虫日常练习-艾图网多页面图片爬取

文章目录前言页面分析设计代码前言 欢迎回来兄弟们&#xff0c;想必各位都已经过了一遍上篇文章了吧&#xff0c;没过的兄弟们可以移步上篇文章指点一二&#xff0c;链接: 爬虫日常练习-艾图网单页面图片爬取 感谢xdm 昨天的内容想必已经挑起了大家的胃口&#xff0c;我们趁…

自动化测试(一):自动化测试理论

什么是自动化测试&#xff1a; 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c;在设计了测试用例并通过评审之后&#xff0c;由测试人员根据测试用例中描述的规程一步步执行测试&#xff0c;得到实际结果与期望结果的比较。在此过程中&#xf…

【前端之旅】快速上手ElementUI

一名软件工程专业学生的前端之旅,记录自己对三件套(HTML、CSS、JavaScript)、Jquery、Ajax、Axios、Bootstrap、Node.js、Vue、小程序开发(Uniapp)以及各种UI组件库、前端框架的学习。 【前端之旅】Web基础与开发工具 【前端之旅】手把手教你安装VS Code并附上超实用插件…

指针在C++中的应用及顺序表结构体中的应用

目录 一.指针的概要 指针 一级指针 二级指针 二、一个生动形象的例子 三、总结 四、顺序表结构体中的应用 一.指针的概要 指针 是一种数据类型&#xff0c;它保存着一个变量的内存地址。指针可以通过间接引用操作符 * 来访问所指向的变量。在 C 中&#xff0c;指针通常…

【AI绘画】探索艺术与技术的融合:AI绘画的新前景

AI绘画的新前景1.AI绘画是把双刃剑2.AI绘画的应用场景3.AI绘画的技术4.结语随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI绘画成为了艺术创作领域中备受关注的话题。传统的艺术创作方式受到了AI技术的冲击&#xff0c;为艺术家和观众带来了全新的体验和…

socket 通信(一)

一 基本示例 #include <stdio.h> #include <sys/socket.h> // socket() #include <arpa/inet.h> // inet_addr() #include <netinet/in.h> // sockaddr_in{} INADDR_ANY #include <unistd.h> // close() #include <errno.h> …

php7类型约束,严格模式

在PHP7之前&#xff0c;函数和类方法不需要声明变量类型 &#xff0c;任何数据都可以被传递和返回&#xff0c;导致几乎大部分的调用操作都要判断返回的数据类型是否合格。 为了解决这个问题&#xff0c;PHP7引入了类型声明。 目前有两类变量可以声明类型&#xff1a; 形参&a…

2023年贵州建筑八大员考试时间报名时间是什么时间呢?甘建二

2023年贵州建筑八大员考试时间报名时间是什么时候开始呢&#xff1f;贵州建筑八大员考试时间是什么时候呢&#xff1f;什么时候考试呢&#xff1f; 建筑八大员主要是用于企业资质、招投标、检查使用&#xff0c;目前很多企业急需这个证书&#xff0c;关于建筑八大员报名时间和考…

网络拥塞控制,对越远的流量越宽容

考虑下面的网络传输场景&#xff1a; ​ S1&#xff0c;S2&#xff0c;S3&#xff0c;S4 向 D 方向发送&#xff0c;R4 发生拥塞。R4 必须丢弃一些数据进行疏导反馈拥塞信号&#xff0c;否则谁也过不去。 优先丢掉离得最近的 S4 的数据&#xff0c;其次依次丢 S3&#xff0c;S2…

051:cesium加载mapbox的多种Style形式地图

第051个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中加载mapbox的多种Style形式地图,包括dark-v11,streets-v12,navigation-night-v1,outdoors-v12,satellite-v9,satellite-streets-v12,light-v10。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实…

如何让心情保持平静?100多条禅修心法

静的层次和阶段 静首先是不要去争&#xff0c;没有任何争的心&#xff0c;没有任何杂念心。静有几个层次阶段&#xff1a; ⒈. 自己的心情相对于自己平静&#xff0c;是平静的第一个阶段。 ⒉. 第二个平静的阶段是&#xff1a;别人觉得你很静&#xff0c;自己也很静&#xf…