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

文章目录

  • 一、前言
    • 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

ATOK

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);//配置承载场景1sim800c_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使用的CIDsim800c_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.rhkb.cn/news/432263.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Next.js和TailwindCss的TailwindCss

最近在研究 Next.js 和 TailwindCss &#xff0c;这两天没事的时候就搞了一个 c。 目前工具部署在 Vercel &#xff0c;欢迎各位体验&#xff08;能提出意见更好嘿嘿&#xff09; 体验地址&#xff1a; https://icon.999872.xyz/ 图片预览 &#x1f447;

MySQL Performance Schema 详解及运行时配置优化

引言 MySQL 的 Performance Schema 是一套性能监控与诊断工具&#xff0c;帮助开发者和数据库管理员收集、分析 MySQL 实例的运行状态&#xff0c;找出性能瓶颈并进行优化。通过 Performance Schema&#xff0c;我们能够监控不同的内部事件、线程、会话、语句执行等关键性能指…

LabVIEW界面输入值设为默认值

在LabVIEW中&#xff0c;将前面板上所有控件的当前输入值设为默认值&#xff0c;可以通过以下步骤实现&#xff1a; 使用控件属性节点&#xff1a;你可以创建一个属性节点来获取所有控件的引用。 右键点击控件&#xff0c;选择“创建” > “属性节点”。 设置属性节点为“D…

Pandas和Seaborn可视化详解

1.Pandas绘图-单变量 概述 pandas库是Python数据分析的核心库 它不仅可以加载和转换数据&#xff0c;还可以做更多的事情&#xff1a;它还可以可视化 pandas绘图API简单易用&#xff0c;是pandas流行的重要原因之一 可视化小技巧: 如果是类别型 柱状 饼图 (类别相对较少 5-…

灵办AI搜索引擎和文档总结工具

前言—— 在信息爆炸的时代&#xff0c;如何高效地获取和处理知识成为了每个人面临的挑战。随着人工智能技术的迅猛发展&#xff0c;本文将深入探讨这一创新工具的功能与优势&#xff0c;以及如何在日常生活和工作中充分利用它&#xff0c;开启智能化的信息获取新篇章。 点击…

金属增材制造咋突破?纳米纹理粉末如何助力金属增材制造?

大家好&#xff0c;今天我们来了解一篇金属增材制造文章——《High absorptivity nanotextured powders for additive manufacturing》发表于《Science Advances》。金属增材制造在医疗、航空航天等领域&#xff0c;它潜力巨大&#xff0c;但目前可打印的金属材料有限&#xff…

握手传输 状态机序列检测(记忆科技笔试题)_2024年9月2日

发送模块循环发送0-7&#xff0c;在每个数据传输完成后&#xff0c;间隔5个clk&#xff0c;发送下一个 插入寄存器打拍处理&#xff0c;可以在不同的时钟周期内对信号进行同步&#xff0c;从而减少亚稳态的风险。 记忆科技笔试题&#xff1a;检测出11011在下一个时钟周期输出…

PowerPoint技巧:将幻灯片里的图片背景设置为透明

在PPT中添加了图片&#xff0c;想要将图片中的背景设置为透明或者想要抠图&#xff0c;有什么方法吗&#xff1f;今天分享两个方法。 方法一&#xff1a; 添加图片&#xff0c;选中图片之后&#xff0c;点击【图片格式】功能&#xff0c;点击最左边的【删除背景】 PPT会自动帮…

vue3扩展echart封装为组件库-快速复用

ECharts ECharts&#xff0c;全称Enterprise Charts&#xff0c;是一款由百度团队开发并开源&#xff0c;后捐赠给Apache基金会的纯JavaScript图表库。它提供了直观、生动、可交互、可个性化定制的数据可视化图表&#xff0c;广泛应用于数据分析、商业智能、网页开发等领域。以…

Distilabel合成数据生成框架简明教程

Distilabel 是一个用于合成数据和 AI 反馈的框架&#xff0c;适用于需要基于经过验证的研究论文的快速、可靠和可扩展的管道的工程师。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 -…

Webpack教程-概述

什么是Webpack Webpack是一个静态资源打包工具。它以一个或多个文件作为打包入口&#xff0c;将整个项目所有的文件编译组合成一个或多个文件进行输出。(输出的文件即编译好的文件&#xff0c;就可以在浏览器上运行) Webpack官网 核心概念 entry (入口) entiry 指webpack…

企业源代码怎么保护?2024年最新推荐10款源代码加密软件

在现代企业中&#xff0c;源代码是核心资产之一&#xff0c;保护源代码安全已成为企业管理中的重中之重。源代码的泄露不仅会导致企业知识产权的流失&#xff0c;还可能带来竞争对手的复制和攻击。因此&#xff0c;采用强大的源代码加密工具已成为许多企业的必要措施。2024年&a…

深入探索 RUM 与全链路追踪:优化数字体验的利器

作者&#xff1a;梅光辉&#xff08;重彦&#xff09; 背景介绍 随着可观测技术的持续演进&#xff0c;多数企业已广泛采用 APM、Tracing 及 Logging 解决方案&#xff0c;以此强化业务监控能力&#xff0c;尤其在互联网行业&#xff0c;产品的体验直接关系着用户的口碑&…

Adaptive Graph Contrastive Learning for Recommendation

Adaptive Graph Contrastive Learning for Recommendation&#xff08;KDD23&#xff09; 源码&#xff1a; https://github.com/HKUDS/AdaGCL 摘要 图神经网络&#xff08;GNNs&#xff09;最近作为推荐系统中的有效协同过滤&#xff08;CF&#xff09;方法受到关注。基于GNN…

昇思MindSpore进阶教程-优化器

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 模型训练过程中&#xff0c;使用优化器更…

BACnet MS/TP协议解析(3)

1、MS/TP帧格式 例如数据&#xff08;hex&#xff09;&#xff1a;55 FF 01 03 02 00 00 D7 0x550xff0x010x030x020x000x000xD7BACnet数据BACnet数据CRC帧头帧类型目的地址源地址BACnet数据长度&#xff0c;大端CRC 2、帧类型 帧类型目前定义为 0-7&#xff0c;8-127 为 AS…

【Unity踩坑】Textmesh Pro是否需要加入Version Control?

问题&#xff1a;如果Unity 项目中用到了Textmesh pro&#xff0c;相关的文件是否也需要签入呢&#xff1f; 回答&#xff1a; 在使用 Unity 的 Version Control&#xff08;例如 Plastic SCM 或 Git&#xff09;时&#xff0c;如果你的项目中使用了 TextMesh Pro&#xff0c…

TCN预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测

TCN预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测 目录 TCN预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料预测效果

武汉正向科技 格雷母线检测方式 :车检,地检

正向科技|格雷母线原理运用-车检&#xff0c;地检 地上检测方式 地址编码器和天线箱安装在移动站上&#xff0c;通过天线箱发射地址信号&#xff0c;地址解码器安装在固定站&#xff08;地面&#xff09;上&#xff0c;在固定站完成地址检测。 车上检测方式 地址编码器安装在…

MySQL Mail服务器集成:如何配置发送邮件?

MySQL Mail插件使用指南&#xff1f;怎么优化 MySQL发邮件性能&#xff1f; MySQL Mail服务器的集成&#xff0c;使得数据库可以直接触发邮件发送&#xff0c;极大地简化了应用架构。AokSend将详细介绍如何配置MySQL Mail服务器&#xff0c;以实现邮件发送功能。 MySQL Mail&…