嵌入式第11次实验

嵌入式软件设计第11次实验报告 

学号:140201236             姓名:沈樟伟

组别:第2组                实验地点:D19

一、实验目的:

1、了解短信AT指令的使用方法。

2、掌握使用短信AT指令驱动SIM900A发送和接收短信的方法。

二、实验内容:

1.使用AT命令进行模块测试,发送和接收短信。

2.编写程序利用触摸屏完成固定号码短信的发送和接收。(需要加上AT测试命令模块、手机SIM卡检测模块、手机信号质量检测模块等等。)

三、实验过程描述及结果展示:

短信常用AT指令

 

程序代码:

#include "sys.h" #include "delay.h"  #include "usart.h"  #include "led.h" #include "lcd.h" #include "key.h"  #include "touch.h"  #include "text.h" #include "w25qxx.h"  #include "malloc.h"  #include "ff.h"  #include "exfuns.h"  #include <string.h> const u16 POINT_COLOR_TBL[OTT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};  extern u16 USART3_RX_STA;  extern u8 USART3_RX_BUF[400]; unsigned char cnt = 0; unsigned char *SMS = 0; u8 SMS_string[10]={"AT+CMGR="}; void LCD_Draw_Circle(u16 x0,u16 y0,u8 r); //串口3发送数据示例代码 // USART_SendData(USART3,send_string[i]); // while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束 //串口3接收数据示例代码 // while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET); // receive_string[i] = (USART_ReceiveData(USART3));

int main(void) {

// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168); //初始化延时函数 uart_init(115200); //初始化串口波特率为115200 uart3_init(115200); 

LED_Init(); //初始化LED  LCD_Init(); //LCD初始化  tp_dev.init(); //触摸屏初始化

LCD_Clear(BLACK); POINT_COLOR=YELLOW;//设置字体为黄色 BACK_COLOR = BLACK;

//初始化SIM900A //发AT测试命令 //设置短信的新消息提示AT+CNMI=2,1; { unsigned char temp; unsigned char send_string0[] = {"AT+CNMI=2,1\x0d\x0a"}; unsigned char send_string1[] = {"AT+CMGF=1\r\n"}; unsigned char send_string2[] = {"AT+CSCS=\"GSM\"\r\n"};

for(temp=0;temp<2;temp++) { USART_SendData(USART3,'A'); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET); USART_SendData(USART3,'T'); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET); USART_SendData(USART3,'0x0d'); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET); USART_SendData(USART3,'0x0a'); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET); } delay_ms(100);

for(temp=0;temp<13;temp++)//发送AT+CNMI=2,1\x0d\x0a { USART_SendData(USART3,send_string0[temp]); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET); } delay_ms(100);

for(temp=0;temp<11;temp++)//发送AT+CMGP=1\r\n { USART_SendData(USART3,send_string1[temp]); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET); } delay_ms(100);

for(temp=0;temp<15;temp++)//发送AT+CSCS=\"GSM\"\r\n { USART_SendData(USART3,send_string2[temp]); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET); } delay_ms(100); } USART3_RX_STA = 0;

//以下代码构建短信发送菜单 { Show_Str(30,30,200,24,"命令按钮区",24,1); Show_Str(248,30,200,24,"文本区",24,1); 

LCD_DrawRectangle(30,70,174,118);//AT测试按钮方程 Show_Str(42,82,200,24,"AT测试按钮",24,1); LCD_DrawRectangle(248,70,452,118);//AT测试按钮的显示文字框

LCD_DrawRectangle(30,142,222,190);//SIM卡测试按钮方程 Show_Str(42,154,204,24,"卡状态测试按钮",24,1); LCD_DrawRectangle(248,142,452,190);//

LCD_DrawRectangle(30,214,198,262); Show_Str(42,226,204,24,"信号测试按钮",24,1); LCD_DrawRectangle(248,214,452,262);

LCD_DrawLine(0,282,479,282);

Show_Str(42,338,204,24,"发送按钮",24,1); LCD_DrawRectangle(30,326,162,374);

Show_Str(168,310,204,16,"发送号码",16,1); LCD_ShowString(256,310,88,16,16,"17801017974"); LCD_DrawRectangle(248,302,452,334);

Show_Str(168,358,204,16,"发送内容",16,1); LCD_ShowString(256,358,150,16,16,"this is test text"); LCD_DrawRectangle(248,350,452,382);

LCD_DrawLine(0,402,479,402);//画分割线

Show_Str(42,458,204,24,"接收按钮:",24,1); LCD_DrawRectangle(30,446,162,494);

Show_Str(168,430,204,16,"来信号码:",24,1); LCD_DrawRectangle(248,422,452,454);

Show_Str(168,478,204,16,"提示灯",16,1);

Show_Str(42,510,204,16,"短信内容:",24,1); LCD_DrawRectangle(30,526,452,766);

//画个圆框用来做短信提示 { int i; POINT_COLOR=YELLOW;//设置字体为黄色 for(i=20;i<22;i++) { LCD_Draw_Circle(272,486,i); } } }

//以下代码扫描触摸屏检测按键 while(1) { tp_dev.scan(0); if(tp_dev.x[0]>30 && tp_dev.x[0]<174 && tp_dev.y[0]>70 &&tp_dev.y[0]<118)//AT测试按钮的按键区域 { u8 i; u8 send_string[] = {"AT\r\n"}; u8 receive_string[20] = {0}; char *p_display; receive_string[19] = '\0';

while(tp_dev.sta & 0x80)//等待触摸屏按键松开 tp_dev.scan(0); USART_ClearFlag(USART3,USART_FLAG_TC);//加上此句,串口发送的第一个字节就不会丢失 for(i=0;i<4;i++) { USART_SendData(USART3,send_string[i]); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!= SET);//等待发送结束 }

//清除触摸值 tp_dev.x[0]=0xFFFF; tp_dev.y[0]=0xFFFF; }

if(tp_dev.x[0]>30 && tp_dev.x[0]<222 && tp_dev.y[0]>142 &&tp_dev.y[0]<190)//SIM卡状态测试按钮 { u8 i; u8 send_string[] = {"AT+CPIN?\r\n"}; u8 receive_string[32] = {0}; char *p_display; receive_string[31] = '\0';

while(tp_dev.sta & 0x80)//等待触摸屏按键松开 tp_dev.scan(0); USART_ClearFlag(USART3,USART_FLAG_TC);//加上此句,串口发送的第一个字节就不会丢失 for(i=0;i<10;i++) { USART_SendData(USART3,send_string[i]); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!= SET);//等待发送结束 }

//清除触摸值 tp_dev.x[0]=0xFFFF; tp_dev.y[0]=0xFFFF; }

if(tp_dev.x[0]>30 && tp_dev.x[0]<198 && tp_dev.y[0]>214 &&tp_dev.y[0]<262)//信号状态测试按钮 { u8 i; u8 send_string[] = {"AT+CSQ\r\n"}; u8 receive_string[32] = {0}; char *p_display; receive_string[31] = '\0';

while(tp_dev.sta & 0x80)//等待触摸屏按键松开 tp_dev.scan(0); USART_ClearFlag(USART3,USART_FLAG_TC);//加上此句,串口发送的第一个字节就不会丢失 for(i=0;i<8;i++) { USART_SendData(USART3,send_string[i]); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!= SET);//等待发送结束 }

//清除触摸值 tp_dev.x[0]=0xFFFF; tp_dev.y[0]=0xFFFF; }

if(tp_dev.x[0]>30 && tp_dev.x[0]<162 && tp_dev.y[0]>326 &&tp_dev.y[0]<374)//发送固定短信测试按钮 { u8 i; u8 send_string1[] = {"AT+CMGS=\"13021257803\"\r\n"}; u8 send_string2[] = {"This is test text!\x1A"};

while(tp_dev.sta & 0x80)//等待触摸屏按键松开 tp_dev.scan(0); USART_ClearFlag(USART3,USART_FLAG_TC);//加上此句,串口发送的第一个字节就不会丢失 for(i=0;i<23;i++) { USART_SendData(USART3,send_string1[i]); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!= SET);//等待发送结束 }

delay_ms(100);

for(i=0;i<19;i++) { USART_SendData(USART3,send_string2[i]); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!= SET);//等待发送结束 }

//清除触摸值 tp_dev.x[0]=0xFFFF; tp_dev.y[0]=0xFFFF; } if(tp_dev.x[0]>30 && tp_dev.x[0]<162 && tp_dev.y[0]>446 &&tp_dev.y[0]<494)//有短信提示后,短信接受按钮 { u8 i; u8 send_string[100] = {"AT+CMGR=\r\n"}; u8 data_r_n[] = {"\r\n\n"}; char *p_display;

while(tp_dev.sta & 0x80)//等待触摸屏按键松开 tp_dev.scan(0); USART_ClearFlag(USART3,USART_FLAG_TC);//加上此句,串口发送的第一个字节就不会丢失

strcat(send_string,SMS); strcat(send_string,data_r_n);

for(i=0;i<12;i++) { USART_SendData(USART3,send_string[i]); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!= SET);//等待发送结束 }

//清除同心圆,表示短信已阅读 { int i; POINT_COLOR = BLACK; for(i=1;i<20;i++) { LCD_Draw_Circle(272,486,i); } POINT_COLOR = YELLOW; }

//清除触摸值 tp_dev.x[0]=0xFFFF; tp_dev.y[0]=0xFFFF; } //以下代码根据串口3收到的信息作出相应的动作 if(USART3_RX_STA & 0x8000)//接收到一次数据 { char *p_display; USART3_RX_BUF[USART3_RX_STA & 0x7FFF] = 0;//添加结束符号

if(p_display = strstr((const char*)USART3_RX_BUF,(const char*)"AT\r\n"))//当收到AT的反馈时 { p_display = p_display+6; LCD_ShowString(260,82,240,24,24,(u8 *)p_display); }

if(p_display = strstr((const char*)USART3_RX_BUF,(const char*)"AT+CPIN?"))//当收到SIM卡状态查询命令的反馈时 { p_display = p_display+19; LCD_ShowString(260,154,240,24,24,(u8 *)p_display); }

if(p_display = strstr((const char*)USART3_RX_BUF,(const char*)"AT+CSQ"))//当收到信号强度测试命令的反馈时 { p_display = p_display+10; LCD_ShowString(260,226,240,24,24,(u8 *)p_display); }

if(p_display = strstr((const char*)USART3_RX_BUF,(const char*)"+CMTI:"))//当收到新消息提示符 { p_display = p_display+12; SMS = p_display; //画同心圆表示来短信了 { int i; POINT_COLOR = RED; for(i=1;i<20;i++) { LCD_Draw_Circle(272,486,i); } POINT_COLOR = YELLOW; } }

if(p_display = strstr((const char*)USART3_RX_BUF,(const char*)"+32"))//当收到消息正文后 { p_display = p_display+6; LCD_ShowString(38,534,320,16,16," "); LCD_ShowString(38,534,320,16,16,p_display);

//给出短信号码 { p_display = strstr((const char*)USART3_RX_BUF,(const char*)"+86"); p_display = p_display+3; LCD_ShowString(256,430,88,16,16," "); LCD_ShowString(256,430,88,16,16,p_display); } } USART_RX_STA=0; } } }

实验结果:

 

总结:

      本次实验的任务是.使用AT命令进行模块测试,发送和接收短信,并编写程序利用触摸屏完成固定号码短信的发送和接收。经过我们的认真思考,总体上没有太大的问题。开始时由于手机开信号的不稳定,造成了一些不必要的问题。其次是由于在程序中加了一句输出语句,导致检验时多一次输出语句。这次实践加深了我对嵌入式的理解与兴趣。

 

转载于:https://www.cnblogs.com/shenzhangwei/p/6659328.html

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

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

相关文章

Linux文件系统之df

df用于查看当前挂载的文件系统-a 查看所有的文件系统可以自己指定容量单位&#xff0c;-BM -BG 但是还是h的选项好用-i 查看inode的使用信息-l(L) 显示本地文件系统--output 可以指定管理员想要看的列--outputField_List可用的字段有source fstype itotal iused iavail ipcent …

普通老实人的生活

2019独角兽企业重金招聘Python工程师标准>>> 有一个朋友&#xff0c;他家有一套营业房&#xff0c;租给了两个年轻人&#xff0c;合同签订为半年&#xff0c;房租7000&#xff0c;合同到期当天&#xff0c;乙方一直没有联系甲方&#xff0c;说明续租或不续租&#x…

如何在 C# 中运行 Python 代码

前言Python是一门强大的编程语言。特别的是&#xff0c;它还具有众多出色的库&#xff08;例如numPy&#xff0c;sciPy&#xff0c;pandas等&#xff09;&#xff0c;可以显著简化和加速开发。因此&#xff0c;在解决某些问题时&#xff0c;通过 Python 实现可能是最理想的方式…

【QGIS入门实战精品教程】10.2:QGIS中DEM三维显示方法

QGIS中数字高程模型DEM三维显示方法。 参考阅读: 【ArcGIS Pro微课1000例】0006:ArcGIS Pro 2.5三维显示DEM数字高程模型 【ArcGIS Pro微课1000例】0005:ArcGIS Pro 2.5基于矢量数据制作拉伸三维地图案例 ArcGIS实验教程——实验二十六:ArcScene实现二维数据的三维显示 文章…

基于Dubbo框架构建分布式服务(三)

我们将上面开发的服务提供方服务&#xff0c;部署到2个独立的节点上&#xff08;192.168.14.1和10.10.4.125&#xff09;&#xff0c;然后可以通过Dubbo管理中心查看对应服务的状况&#xff0c;如图所示&#xff1a; 上图中可以看出&#xff0c;该服务有两个独立的节点可以提供…

开篇-开启全新的.NET现代应用开发体验

01云原生技术底座畅想DaprMASA Framework研发管理研发协作平台&#xff1a;CI/CD、Application ManagementApplication Quota Management、Version Control、Troubleshooting、Testable网格应用程序管理API网关&#xff1a;Reverse Proxy、Traffic Control 、Security Strategy…

【QGIS入门实战精品教程】10.3:QGIS栅格DEM数据重复类方法案例汇总

QGIS栅格DEM数据重复类方法案例汇总:按表格重分类、按图层重分类。 参考阅读: 【GlobalMapper精品教程】029:栅格重分类案例详解 ArcGIS实验教程——实验四十三:ArcGIS栅格重分类(Reclass)案例详解 ArcGIS怎样获取重分类后各类所占的像元个数 文章目录 一、按表格分类二、…

QT添加rtmp库的时候出现问题

刚开始出现undefined reference to __chkstk的错误。 然后在vc里面找到chkstk.obj放到相关目录下并在工程文件直接添加&#xff1a; LIBS "E:\QTProjects\RTMP\RTMPDelayTest\librtmp\lib\chkstk.obj" 又出现了新的错误 E:\QTProjects\RTMP\RTMPDelayTest\librtmp\l…

@Before,@BeforeClass,@BeforeEach和@BeforeAll之间的区别

Before的代码在每次测试之前执行 BeforeClass在整个测试方法执行之前运行一次 如果您的测试类有十个测试&#xff0c;则Before代码将执行十次&#xff0c;但是BeforeClass将仅执行一次。 当多个测试需要共享相同的代码时&#xff0c;可以使用BeforeClass 。 建立数据库连接属于…

.NET MAUI 跨平台应用开发 I|.NET MAUI 跨平台基础

编辑&#xff1a;Alan Wang排版&#xff1a;Rani Sun微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0c;将每周三到周六&…

走出宣传,国产VR手机盒子到底哪家强?

国产VR手机盒子作为入门机是一个不错的选择&#xff0c;不过你知道哪一款更适合你吗&#xff1f; 从去年看虚拟现实还是一个遥不可及的梦&#xff0c;今年却真正的火起来了。各大厂商纷纷推出自家的VR设备&#xff0c;宣传活动如火如荼。爱尝鲜的你是否按耐不住? 如果你觉得动…

【ArcGIS Pro微课1000例】0024:自定义坐标系统---以阿尔伯斯投影(Albers)为例

在实际工作中,经常需要进行矢量数据或栅格数据的投影转换工作,但有时候ArcGIS中恰恰没有我们需要的坐标系,此时,就需要我们自定义坐标系。本文以阿尔伯斯投影(Albers)为例,讲解自定义投影的一般过程及注意事项。 文章目录 一、自定义坐标系二、投影转换一、自定义坐标系…

旧金山参议员提议发布“封杀令”,理由是马路不为机器人所服务

说实话&#xff0c;这个理由有够奇葩。 因为快递无人机所受限制颇多&#xff0c;渐渐地&#xff0c;越来越多的快递机器人被研制出来&#xff08;这里的“机器人”&#xff0c;包括无人车和及机器人&#xff09;&#xff0c;用于城市的快递发送&#xff0c;比如国内的京东无人…

【QGIS入门实战精品教程】7.2:QGIS点状数据符号化设置案例教程

点状符号化的类型有:单一符号、分类、渐进、基于规则、点的位移、点聚类、热图。 相关阅读: 【QGIS入门实战精品教程】7.1:QGIS面状数据符号化设置案例教程 文章目录 一、单一符号二、分类三、渐进四、基于规则五、点的位移六、点聚类七、热图一、单一符号 跟面状符号一样,…

SpringCloud与Dubbo的比较

Dubbo 一、dubbo简介 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架&#xff0c;使得应用可通过高性能的RPC实现服务的输出和输入功能&#xff0c;可以和Spring框架无缝集成。 Dubbo是一款高性能、轻量级的开源Java RPC框架&#xff0c;它提供了三大核心能力&#xff…

VR 技术加上 8K 画质! 2016 年里约奥运会亮点十足

据报道&#xff0c;2016 年里约奥运会将运用到 VR 技术。 最近&#xff0c;奥林匹克广播服务公司&#xff08;OBS&#xff09;表示出对虚拟现实技术的兴趣&#xff0c;其实用虚拟现实技术报道赛事已经不是什么新鲜的事了&#xff0c;之前 NBA 就这样做过&#xff0c;但是将奥运…

WPF 实现柱形统计图

WPF 实现柱形统计图WPF 实现柱形统计图作者&#xff1a;WPFDevelopersOrg原文链接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40&#xff1b;Visual Studio 2022;项目使用 MIT 开源许可协议&#xff1b;避免画线发虚DrawingContext…

100亿人口会挨饿吗?人工智能迎击全球粮食问题

给作物看病的AI、走路“长眼”的拖拉机、上帝视角的卫星数据分析——未来吃饭就靠它们了。 图片来源&#xff1a;Blue River Technology 人类又面临了一项危机——随着人口不断膨胀&#xff0c;到2050年人类总人口也许要达到100亿&#xff0c;然而&#xff0c;地球却没有等比例…

switch注意事项

Day03_SHJavaTraining_4-5-2017 switch注意事项&#xff1a;①switch语句接受的数据类型  switch语句中的表达式的数据类型,是有要求的    JDK1.0 - 1.4 数据类型接受 byte short int char    JDK1.5 数据类型接受 byte short int char enum(枚举)  …

SkiaSharp 之 WPF 自绘 粒子花园(案例版)

此案例包含了简单的碰撞检测&#xff0c;圆形碰撞检测方法&#xff0c;也可以说是五环弹球的升级版&#xff0c;具体可以根据例子参考。粒子花园这名字是案例的名字&#xff0c;效果更加具有科技感&#xff0c;很是不错&#xff0c;搞搞做成背景特效也是不错的选择。Wpf 和 Ski…