单片机串口AT指令操作SIM800、900拨打电话

news2024/10/2 3:20:58

文章目录

  • 一、前言
    • 1.1 功能简介
    • 1.2 拨打电话功能的应用场景
    • 1.3 SIM900A与SIM800C模块介绍
    • 1.4 原理图
  • 三、模块调试
    • 3.1 工具软件下载
    • 3.2 准备好模块
    • 3.3 串口调试助手的设置
    • 3.4 初始化配置
    • 3.5 拨打电话的测试流程
  • 四、代码实现
    • 4.1 底层的命令发送接口
    • 4.2 底层数据接收接口
    • 4.3 检测模块是否存在
    • 4.4 网络时间同步
    • 4.5 拨打电话与接听电话

一、前言

1.1 功能简介

随着物联网技术的快速发展,无线通信模块成为了连接物理世界与数字世界的桥梁。在众多无线通信解决方案中,SIM系列模块以其紧凑的设计、良好的网络兼容性以及丰富的功能特性而受到广泛欢迎。SIM系列模块不仅支持基础的GSM服务如语音通话和短信收发,还能够通过GPRS进行数据传输,非常适合应用于各种智能设备和远程监控系统中。

对于开发者而言,如何有效地利用SIM系列模块实现特定功能成为了一个重要技术点。其中,使用串行通信接口(即串口)发送AT指令来控制模块是实现这一目标的关键手段之一。AT指令集提供了一套标准化的方法,让工程师可以通过简单的文本命令与模块交互,从而执行复杂任务。本文将以SIM800C为例,详细介绍如何通过串口AT指令对SIM800C进行调试,实现打电话和接听电话这两个常见应用场景。通过对相关AT指令的学习及实践操作,将能够掌握如何设置并测试SIM800C的基本通话功能。

image-20240924141930621

1.2 拨打电话功能的应用场景

这里以SIM800C模块为例进行介绍。

在物联网(IoT)应用中,SIM800C模块的拨打电话功能可以实现多种实用的功能,尤其是在需要远程控制、监控或紧急响应的情况下。

以下是几个具体的应用场景:

(1)远程控制:通过拨打预设的电话号码,用户可以从远处激活或控制设备。例如,在智能家居系统中,可以通过电话呼叫来打开或关闭家中的灯光、调整空调温度或是启动安防系统。

(2)安全报警:当监测到异常情况时,如入侵警报、火灾预警等,SIM800C可以自动拨打预先设置好的紧急联系人或服务中心电话,及时通报情况并请求帮助。这种方式能够迅速传达警情,提高响应速度。

(3)状态查询:某些情况下,用户可能希望直接与远端设备进行互动以获取实时信息。比如农业环境监测站,农民可以通过拨打特定号码来接收土壤湿度、气温等数据报告。

(4)语音提示:结合语音合成技术,SIM800C还可以用来发送语音消息给用户。这在一些公共服务领域特别有用,例如公共交通车辆到达提醒、天气预报更新等。

(5)医疗辅助:对于老年人护理或者慢性病患者管理来说,SIM800C可以被集成进穿戴式健康监测器内。一旦检测到生命体征异常,设备会自动拨打医生或家属的电话,确保病人能够得到及时救助。

(6)工业自动化:在复杂的工业环境中,维护人员可能需要定期检查机器运行状况。利用SIM800C建立一个简易的语音通信通道后,工作人员就可以随时随地拨入系统听取设备状态汇报了。

(7)物流跟踪:货物运输途中,通过安装带有SIM800C模块的追踪装置,物流公司能够更加方便地与司机保持联系,甚至可以在必要时主动发起通话询问具体情况。

借助SIM800C的拨打电话功能,开发者能够在多种IoT应用场景下构建出高效且可靠的通讯解决方案。

1.3 SIM900A与SIM800C模块介绍

SIM900A和SIM800C都是由SIMCom公司设计生产的GSM/GPRS通信模块,它们广泛应用于各种物联网(IoT)设备中,提供语音通话、短信服务以及数据传输功能。这些模块基于成熟可靠的GSM技术,适用于全球范围内的多种应用场合。

SIM900A,它是一款四频GSM/GPRS模块,支持850MHz、900MHz、1800MHz和1900MHz频率,这意味着它可以适应世界上几乎所有地区的GSM网络。SIM900A拥有紧凑的设计,尺寸为24 x 24 x 3 mm,非常适合集成到空间有限的项目中。该模块通过标准AT指令集进行控制,允许开发者轻松实现电话拨打、短信收发及GPRS连接等功能。此外,SIM900A还具备低功耗模式,在不活跃时可以节省电池寿命,这对于依赖电池供电的远程监控系统尤其重要。

SIM800C,这是SIMCom推出的另一款高性能GSM/GPRS模块,同样支持四频GSM网络,并且在某些方面对SIM900A进行了改进或扩展。例如,SIM800C不仅保持了小巧的体积,还在性能上有所提升,特别是在处理速度和稳定性方面。与SIM900A一样,SIM800C也遵循标准AT命令集,使得迁移现有应用程序变得相对容易。值得注意的是,SIM800C增加了对更多高级功能的支持,如增强型音频接口,这使其成为需要高质量语音通信的应用的理想选择。此外,SIM800C还优化了电源管理机制,进一步降低了待机状态下的能耗。

除了上述特性外,无论是SIM900A还是SIM800C,都提供了丰富的外部接口选项,包括UART串口、GPIO引脚、ADC输入等,方便用户根据实际需求定制开发。同时,两者均兼容广泛的SIM卡类型,从普通SIM卡到更先进的USIM卡均可使用。这些特点使得SIM900A和SIM800C能够满足不同层次的应用需求,从简单的信息传递到复杂的物联网解决方案。

SIM900A和SIM800C作为SIMCom旗下广受欢迎的GSM/GPRS模块系列成员,各自以其独特的优势服务于不同的市场细分领域。无论是在智能家居、工业自动化、移动支付终端还是车辆追踪系统等领域,这些模块都能够提供稳定可靠的无线通信能力,助力于构建更加智能互联的世界。随着技术不断进步,未来我们还可以期待看到更多具有创新特性的新型号推出,以更好地应对日益增长的市场需求。

1.4 原理图

image-20240924132944926

三、模块调试

3.1 工具软件下载

项目设计里用到的工具软件,STM32的源码工程,都可以在这里下载。
https://pan.quark.cn/s/145a9b3f7f53

3.2 准备好模块

(1)ATK-SIM800C GSM/GPRS 模块一个

(2)直流稳压电源1个(推荐12V 1A电源)

(3)中国移动/联通GSM SIM卡一张(未停机,开通GPRS业务)

(4)耳机一副(带麦克风功能,用于通话测试)

3.3 串口调试助手的设置

模块接好线,连接上电脑之后,发送AT命令测试模块是否正常(注意 勾选新行)。

说明: 第一次发送AT 过去时,模块会匹配波特率,模块会自适应波特率; 第二次发送AT就会返回OK

AT

OK

image-20240122214002689

3.4 初始化配置

下面是上电初始的设置指令。

【1】测试模块是否正常
发送: AT
模块会返回: OK

【2】 设置TTS来电有铃声
发送: AT+CTTSRING=0
模块会返回: OK

【3】设置TTS声音大小、语调配置
发送: AT+CTTSPARAM=20,0,50,70,0
模块会返回: OK

【4】设置来电显示
发送: AT+CLIP=1
模块会返回: OK

【5】设置被叫号码显示
发送: AT+COLP=1
模块会返回: OK

3.5 拨打电话的测试流程

下面是介绍关于电话相关的指令。

【1】拨打电话
ATD指令用于拨打任意电话号码,格式为:ATD【号码】; 末尾的’;’一定要加上,否则不能
成功拨号,如发送:ATD10086;,即可实现拨打10086。

发送: ATD10086;
模块会返回: +COLP: 表示拨号成功。

如果返回NO CARRIERNO ANSWERERROR都表示错误。

【2】应答电话
ATA指令,用于应答电话,当收到来电的时候,给模块发送:ATA,即可接听来电。
发送: ATA
模块会返回: OK

如果模块收到+CLIP:就表示收到来电,可以发送ATA接听电话。

【3】挂断电话
ATH指令,用于挂断电话,要想结束正在进行的通话,只需给模块发送:ATH,即可挂断。
发送: ATH
模块会返回: OK

四、代码实现

下面是通过STM32完成对SIM800C模块控制完成短信发送、电话拨打等操作。

4.1 底层的命令发送接口

//SIM800C发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果
//其他,期待应答结果的位置(str的位置)
u8* sim800c_check_cmd(u8 *str)
{
	char *strx=0;
	if(USART2_RX_STA&0X8000)		//接收到一次数据了
	{ 
		USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//添加结束符
		strx=strstr((const char*)USART2_RX_BUF,(const char*)str);
	} 
	return (u8*)strx;
}
//向SIM800C发送命令
//cmd:发送的命令字符串(不需要添加回车了),当cmd<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串.
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)
//       1,发送失败
u8 sim800c_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART2_RX_STA=0;
	if((u32)cmd<=0XFF)
	{
		while(DMA1_Channel7->CNDTR!=0);	//等待通道7传输完成   
		USART2->DR=(u32)cmd;
	}else u2_printf("%s\r\n",cmd);//发送命令
	

	if(ack&&waittime)	  //需要等待应答
	{
	   while(--waittime)  //等待倒计时
	   {
		  delay_ms(10);
		  if(USART2_RX_STA&0X8000)//接收到期待的应答结果
		  {
			  if(sim800c_check_cmd(ack))break;//得到有效数据 
			  USART2_RX_STA=0;
		  } 
	   }
	   if(waittime==0)res=1; 
	}
	return res;
} 

4.2 底层数据接收接口

//接收SIM800C数据
//request:期待接收命令字符串
//waittimg:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)
//       1,发送失败
u8 sim800c_wait_request(u8 *request ,u16 waittime)
{
	 u8 res = 1;
	 u8 key; 
	 if(request && waittime)
	 {
		 while(--waittime)
		 {   
		    key=KEY_Scan(0);
		    if(key==WKUP_PRES) return 2;
		    delay_ms(10);
		    if(USART2_RX_STA &0x8000)//接收到期待的应答结果
			{
				if(sim800c_check_cmd(request)) break;//得到有效数据
				USART2_RX_STA=0;
			}
		 }
		 if(waittime==0)res=0;
	 }
	 return res;
}

4.3 检测模块是否存在

while(sim800c_send_cmd("AT","OK",100))//检测是否应答AT指令 
{
    Show_Str(40,55,200,16,"未检测到模块!!!",16,0);
    delay_ms(800);
    LCD_Fill(40,55,200,55+16,WHITE);
    Show_Str(40,55,200,16,"尝试连接模块...",16,0);
    delay_ms(400);  
} 	 

4.4 网络时间同步

//NTP网络同步时间
void ntp_update(void)
{  
	 sim800c_send_cmd("AT+SAPBR=3,1,\"Contype\",\"GPRS\"","OK",200);//配置承载场景1
	 sim800c_send_cmd("AT+SAPBR=3,1,\"APN\",\"CMNET\"","OK",200);
	 sim800c_send_cmd("AT+SAPBR=1,1",0,200);                        //激活一个GPRS上下文
     delay_ms(5);
     sim800c_send_cmd("AT+CNTPCID=1","OK",200);                     //设置CNTP使用的CID
	 sim800c_send_cmd("AT+CNTP=\"202.120.2.101\",32","OK",200);     //设置NTP服务器和本地时区(32时区 时间最准确)
     sim800c_send_cmd("AT+CNTP","+CNTP: 1",600);                    //同步网络时间
}

4.5 拨打电话与接听电话

//SIM800C拨号测试
//用于拨打电话和接听电话
//返回值:0,正常
//其他,错误代码
u8 sim800c_call_test(void)
{
	u8 key;
	u16 lenx;
	u8 callbuf[20]; 
	u8 pohnenumlen=0;	//号码长度,最大15个数 
	u8 *p,*p1,*p2;
	u8 oldmode=0;
	u8 cmode=0;	//模式
				//0:等待拨号
				//1:拨号中
	            //2:通话中
				//3:接收到来电 
	LCD_Clear(WHITE);
	if(sim800c_send_cmd("AT+CTTSRING=0","OK",200))return 1;	//设置TTS来电设置 0:来电有铃声 1:没有
	if(sim800c_send_cmd("AT+CTTSPARAM=20,0,50,70,0","OK",200))return 1;	//设置TTS声音大小、语调配置
	if(sim800c_send_cmd("AT+CLIP=1","OK",200))return 1;	//设置来电显示  
	if(sim800c_send_cmd("AT+COLP=1","OK",200))return 2;	//设置被叫号码显示
 	p1=mymalloc(20);								//申请20直接用于存放号码
	if(p1==NULL)return 2;	
	POINT_COLOR=RED;
	Show_Str_Mid(0,30,"SIM800C 拨号测试",16,240);				    	 
	Show_Str(40,70,200,16,"请拨号:",16,0); 
	kbd_fn_tbl[0]="拨号";
	kbd_fn_tbl[1]="返回"; 
	sim800c_load_keyboard(0,180,(u8**)kbd_tbl1);
	POINT_COLOR=BLUE; 
	while(1)
	{
		delay_ms(10);
		if(USART2_RX_STA&0X8000)		//接收到数据
		{
			sim_at_response(0);
			if(cmode==1||cmode==2)
			{
				if(cmode==1)if(sim800c_check_cmd("+COLP:"))cmode=2;	//拨号成功
				if(sim800c_check_cmd("NO CARRIER"))cmode=0;	//拨号失败
				if(sim800c_check_cmd("NO ANSWER"))cmode=0;	//拨号失败
				if(sim800c_check_cmd("ERROR"))cmode=0;		//拨号失败
			}
			if(sim800c_check_cmd("+CLIP:"))//接收到来电
			{
				cmode=3;
				p=sim800c_check_cmd("+CLIP:");
				p+=8;
				p2=(u8*)strstr((const char *)p,"\"");
				p2[0]=0;//添加结束符 
				strcpy((char*)p1,(char*)p);
			}
			USART2_RX_STA=0;
		}
		key=sim800c_get_keynum(0,180);
		if(key)
		{ 
			if(key<13)
			{
				if(cmode==0&&pohnenumlen<15)
				{ 
					callbuf[pohnenumlen++]=kbd_tbl[key-1][0];
					u2_printf("AT+CLDTMF=2,\"%c\"\r\n",kbd_tbl[key-1][0]); 
					delay_ms(55);//延时
				  u2_printf("AT+CTTS=2,\"%c\"\r\n",kbd_tbl[key-1][0]); //TTS语音		
				}else if(cmode==2)//通话中
				{ 
					u2_printf("AT+CLDTMF=2,\"%c\"\r\n",kbd_tbl[key-1][0]);
					delay_ms(100);
					u2_printf("AT+VTS=%c\r\n",kbd_tbl[key-1][0]); 
					LCD_ShowChar(40+56,90,kbd_tbl[key-1][0],16,0);
				}
			}else
			{
				if(key==13)if(pohnenumlen&&cmode==0)pohnenumlen--;//删除
				if(key==14)//执行拨号
				{
					if(cmode==0)//拨号模式
					{
						callbuf[pohnenumlen]=0;			//最后加入结束符
            printf("ATD:%s\r\n",callbuf);						
						u2_printf("ATD%s;\r\n",callbuf);//拨号
						sim_at_response(1);
						delay_ms(10);		        	//等待10ms  
						cmode=1;						//拨号中模式
					}else 
					{
						u2_printf("AT\r\n");//必须加上这句
						delay_ms(10);
						sim800c_send_cmd("ATH","OK",100);//挂机
						sim800c_send_cmd("ATH","OK",100);//挂机
						cmode=0;
					}
				}
				if(key==15)
				{
					if(cmode==3)//接收到来电
					{
						sim800c_send_cmd("ATA","OK",200);//发送应答指令
						Show_Str(40+56,70,200,16,callbuf,16,0);
						cmode=2;
					}else
					{ 
						sim800c_send_cmd("ATH",0,0);//不管有没有在通话,都结束通话
						break;//退出循环
					}
				}
			} 
			if(cmode==0)//只有在等待拨号模式有效
			{
				callbuf[pohnenumlen]=0; 
				LCD_Fill(40+56,70,239,70+16,WHITE);
				Show_Str(40+56,70,200,16,callbuf,16,0);  	
			}				
		}
		if(oldmode!=cmode)//模式变化了
		{
			switch(cmode)
			{
				case 0: 
					kbd_fn_tbl[0]="拨号";
					kbd_fn_tbl[1]="返回"; 
					POINT_COLOR=RED;
					Show_Str(40,70,200,16,"请拨号:",16,0);  
					LCD_Fill(40+56,70,239,70+16,WHITE);
					if(pohnenumlen)
					{
						POINT_COLOR=BLUE;
						Show_Str(40+56,70,200,16,callbuf,16,0);
					}
					break;
				case 1:
					POINT_COLOR=RED;
					Show_Str(40,70,200,16,"拨号中:",16,0); 
					pohnenumlen=0;
				case 2:
					POINT_COLOR=RED;
					if(cmode==2)Show_Str(40,70,200,16,"通话中:",16,0); 
					kbd_fn_tbl[0]="挂断";
					kbd_fn_tbl[1]="返回"; 	
					break;
				case 3:
					POINT_COLOR=RED;
					Show_Str(40,70,200,16,"有来电:",16,0); 
					POINT_COLOR=BLUE;
					Show_Str(40+56,70,200,16,p1,16,0); 
					kbd_fn_tbl[0]="挂断";
					kbd_fn_tbl[1]="接听"; 
					break;				
			}
			if(cmode==2)Show_Str(40,90,200,16,"DTMF音:",16,0);	//通话中,可以通过键盘输入DTMF音
			else LCD_Fill(40,90,120,90+16,WHITE);
			sim800c_load_keyboard(0,180,(u8**)kbd_tbl1);		//显示键盘 
			oldmode=cmode; 
		}
		if((lenx%50)==0)
		{
			LED0=!LED0; 	    				 
		  u2_printf("AT\r\n");//必须加上这句,不然接收不到来电显示
		}
		lenx++;	 
	} 
	myfree(p1);
	return 0;
}

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

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

相关文章

Cisco Packet Tracer的安装加汉化

这个工具学计算机网络的同学会用到 1.下载安装 网盘链接&#xff1a;https://pan.baidu.com/s/1CmnxAD9MkCtE7pc8Tjw0IA 提取码&#xff1a;frkb 点击第一个进行安装&#xff0c;按步骤来即可。 2.汉化 &#xff08;1&#xff09;复制chinese.ptl文件 &#xff08;2&…

四元组问题

目录 问题描述 输入格式 输出格式 样例输入 样例输出 说明 评测数据规模 运行限制 原题链接 代码思路 问题描述 从小学开始&#xff0c;小明就是一个非常喜欢数学的孩子。他喜欢用数学的方式解决各种问题。在他的高中时期&#xff0c;他遇到了一个非常有趣的问题&…

【Unity服务】如何使用Unity Version Control

Unity上的线上服务有很多&#xff0c;我们接触到的第一个一般就是Version Control&#xff0c;用于对项目资源的版本管理。 本文介绍如何为项目添加Version Control&#xff0c;并如何使用&#xff0c;以及如何将项目与Version Control断开链接。 其实如果仅仅是对项目资源进…

华盈伯乐 | Bio-Plex多重细胞因子检测技术培训及研讨会现场回顾

精彩华盈现场回顾 迎着朝霞&#xff0c;与会的伙伴们一早踏上了旅程&#xff0c;参与华盈生物与伯乐生命科学联合举办的Bio-Plex多重细胞因子检测技术培训及研讨会活动。随着活动的序幕缓缓拉开&#xff0c;我们迎来了一段充实而富有成效的学习之旅。 精彩开幕 华盈生物的副总…

SpringMVC4-SpringMVC获取请求参数

test_param.html&#xff1a; <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>测试请求参数</title> </head> <body> <h1>测…

解决Pymysql has no attribute ‘escape_string‘ 并且无法引入该模块

打印出的pymysql版本是1.4.6 需要import这个module&#xff0c;并且根据pymysql的版本import的方式还不同 import pymysqlif pymysql.__version__ >1.0.0:from pymysql.converters import escape_string else:escape_string lambda x: pymysql.escape_string(x)然而&am…

如何借助Java批量操作Excel文件?

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 前言 | 问题背景 在操作Excel的场景中&#xff0c;通常会有一些针对Excel的批量操作&#xff0c;批量的意思一般有两种&#xff1a; 对批量的Excel文件进行操作。如导入多个Excel文件…

鸿蒙OpenHarmony【小型系统基础内核(虚实映射)】子系统开发

虚实映射 基本概念 虚实映射是指系统通过内存管理单元&#xff08;MMU&#xff0c;Memory Management Unit&#xff09;将进程空间的虚拟地址与实际的物理地址做映射&#xff0c;并指定相应的访问权限、缓存属性等。程序执行时&#xff0c;CPU访问的是虚拟内存&#xff0c;通…

实现微信小程序中点击单词显示在input的交互功能指南

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

卷积神经网络-学习率

文章目录 一、学习率的定义二、学习率的作用三、学习率的调整方法1.有序调整(1).有序调整StepLR(等间隔调整学习率&#xff09;(2).有序调整MultiStepLR(多间隔调整学习率)(3).有序调整ExponentialLR (指数衰减调整学习率)(4).有序调整CosineAnnealing (余弦退火函数调整学习率…

TypeScript 设计模式之【单例模式】

文章目录 **单例模式**: 独一无二的特工我们为什么需要这样的特工?单例模式的秘密&#xff1a;如何培养这样的特工?特工的利与害代码实现单例模式的主要优点单例模式的主要缺点单例模式的适用场景总结 单例模式: 独一无二的特工 单例模式就像是一个秘密组织里的特殊特工。这…

Java介绍及JDK 21详细安装教程

文章目录 1. 文章简介2. Java和JDK的介绍与关系2.1 Java2.2 JDK 3. Java版本的发展历程4. Java 21安装步骤 1. 文章简介 本文介绍如何Java、JDK、Java的发展及如何快速安装JDK 21。内容详细充实&#xff0c;旨在帮助您快速了解并使用Java。 2. Java和JDK的介绍与关系 2.1 Jav…

828华为云征文|华为云Flexus云服务器X实例——部署EduSoho网校系统、二次开发对接华为云视频点播实现CDN加速播放

EduSoho 是一款功能强大的网校系统&#xff0c;能够帮助教育机构快速搭建在线学习平台。本文将详细介绍如何在华为云服务器上安装和部署 EduSoho 网校系统&#xff0c;以及二次开发对接华为云视频点播VOD来实现CDN加速播放。 edusoho本地存储的视频播放存在诸多弊端。一方面&a…

「C++系列」命名空间

【人工智能教程】&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站&#xff1a;【人工智能教程】 文章目录 一、命名空间1. 定义命名空间2. 使用命名空间中的成员3. 命名空间的…

SAP 利润分配-未分配利润的年初余额和年末余额不一致的问题

SAP OB53 本年利润科目的年初余额和年末余额不一致的问题 关于OB53科目的问题 OB53维护的本年利润科目 现象&#xff1a;为何去年年末的本年利润金额和今年年初的本年利润金额不一致。 解释原因&#xff1a; 本年利润科目的这种现象归根结底是“表结法”产生的&#xff0c;换…

QT----Creater14.0,qt5.15无法启动调试,Launching GDB Debugger报红

问题描述 使用QT Creater 14.0 和qt5.15,无法启动调试也没有报错,加载debugger报红 相关文件都有 解决方案 尝试重装QT,更换版本5.15.2,下载到文件夹,shift鼠标右键打开powershell输入 .\qt-online-installer-windows-x64-4.8.0.exe --mirror http://mirrors.ustc.edu.cn…

VMware 虚拟机配置固定 IP

1. VMware 配置 参考&#xff1a;https://blog.csdn.net/jsryin/article/details/123304582 参考&#xff1a;https://zhuanlan.zhihu.com/p/455097916 1.1. 点击编辑 -> 虚拟网络编辑器 1.2. Net 设置 选择VMnet8 进行配置 查看当前虚拟机的网关是192.168.17.2&#x…

HAproxy-7层负载均衡集群根据不同服务请求分配服务器

搭建HAproxy----7层负载均衡集群的补充 https://blog.csdn.net/qq_73990369/article/details/142500451?spm1001.2014.3001.5501 一、再准备两台虚拟机进行测试 192.168.229.15/24 ----php1 192.168.229.16/24 ----php2 1、PHP1 & php2(192.168.229.15/24 ,192…

做网站建设公司为客户着想方面

作为一家专业的网站建设公司&#xff0c;我们始终将客户的需求置于首位&#xff0c;致力于为客户打造独具特色、功能强大的网站&#xff0c;助力他们在激烈的市场竞争中脱颖而出。 专业团队&#xff0c;定制化服务 我们的团队由技术精湛、经验丰富的专业人才组成&#xff0c;能…

【笔记】光的衍射

一、 衍射现象 波遇到障碍物时&#xff0c;绕过障碍物 进入几何阴影区。 光偏离直线传播路径进入几何 阴影区&#xff0c;并形成光强非均匀稳 定分布。 二、菲涅耳原理 1、 惠更斯原理 波面上的每一点均为发 射子波的波源&#xff0c;这些子波的 包络面即新的波阵面 成功…