嵌入式第十一次

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

学号:140201213                   姓名:崔浩

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

一、实验目的:

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

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

二、实验内容:

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

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

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

短信常用AT指令1

短信常用AT指令2

GSM短信发送菜单示例

实现代码:

#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;

}

}

}

四、总结及实验心得:

了解L短信AT指令的方法,这是最后一周课程感觉学到了很多知识。

时间: 2024-10-20 09:19:15

嵌入式第十一次的相关文章

嵌入式 Linux C语言(十一)——C语言模块化编程

嵌入式 Linux C语言(十一)--C语言模块化编程 一.C语言模块化编程 所谓模块化编程,就是指一个程序包含多个源文件(.c 文件和 .h 文件),每个模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明.C语言模块化编程中对.c..h文件的潜规则: 1..c 文件主要负责实现,也就是定义函数:.h 文件主要负责声明,比如函数声明.宏定义等,结构的定义.自定义数据类型一般也放在头文件中,不能在.h文件中定义变量.将一个功能模块的代码单独编写成一个.c文件,然后把该

嵌入式Linux裸机开发(十一)——Nandflash

嵌入式Linux裸机开发(十一)--Nandflash 一.Nand Flash简介 NandFlash是Flash的一种,具有容量较大,改写速度快等优点,适用于大量数据的存储.NandFlash没有专门的地址线,发送指令.地址和数据都通过8/16位宽的总线(I/O接口)到内部的寄存器. NandFlash分为SLC和MLC两类.SLC全称为Single-Level Cell,单层单元闪存,MLC全称为Multi-Level Cell,多层单元闪存.SLC每一个单元储存一位数据,而MLC通过使用

嵌入式 Linux进程间通信(十一)——多线程简介

嵌入式 Linux进程间通信(十一)--多线程简介 一.线程简介 线程有四种:内核线程.轻量级进程.用户线程.加强版用户线程 1.内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间.支持多线程的内核叫做多线程内核(Multi-Threads kernel ). 2.轻量级进程LWP 轻量级进程(LWP)是一种由内核支持的用户线程,是基于内核线程的高级抽象,只有先支持内核线程,才能有轻量级进程LWP.每一个

cortex_m3_stm32嵌入式学习笔记(十一):TFTLCD显示(初涉显示器)

本章我们将介绍 ALIENTEK 2.8 寸 TFT LCD 模块,该模块采用 TFTLCD 面板,可以显示 16 位色的真彩图片. TFT-LCD 即薄膜晶体管液晶显示器.其英文全称为: Thin Film Transistor-Liquid CrystalDisplay. TFT-LCD 与无源 TN-LCD. STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管( TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质

cortex_m3_stm32嵌入式学习笔记(二十一):SPI实验(通信总线)

SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口.是 Motorola首先在其 MC68HCXX 系列处理器上定义的. SPI 接口主要应用在 EEPROM, FLASH,实时时钟, AD 转换器,还有数字信号处理器和数字信号解码器之间. SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信

Linux嵌入式驱动学习之路(二十一)字符设备驱动程序总结和块设备驱动程序的引入

字符设备驱动程序 应用程序是调用C库中的open read write等函数.而为了操作硬件,所以引入了驱动模块. 构建一个简单的驱动,有一下步骤. 1. 创建file_operations 2. 申请设备号 3. 注册字符设备驱动, 4. 驱动入口 5. 驱动出口 检查数据是否到来的方式: 1. 查询方式 2. 休眠唤醒方式 如果设备出现异常而无法唤醒时,则将永远处于休眠状态. 3. poll机制 如果没有被唤醒,则在一定时间内可自己唤醒. 4. 异步通知(信号) 而以上的几种方式通用性不高,

Linux嵌入式驱动学习之路(十一)按键驱动

轮询方式: 和led驱动不同的是在配置IO引脚的时候,把LED的输出引脚换成输入,在read函数中向外发送io的状态.必须由应用程序不断的来查询当前IO口的状态来判断. 中断方式: sd

嵌入式系统编程和调试技巧

嵌入式系统的开发,软件的运行稳定可靠是非常重要的.在芯片中,软件是没有质量的,但软件的质量可以决定一颗芯片的成败.芯片设计中,性能能否满足设计要求,除了硬件设计.软硬件配合的设计技巧,对于软件来说,编程的一些技术和技巧同样重要. 本文讲述我在芯片固件开发过程中使用的一些编程调试技巧.针对在嵌入式系统开发中常见的问题,如实时系统下的同步问题,动态内存分配的内存泄漏问题,如何在编程阶段预防BUG出现,调试阶段如何及时发现问题和定位问题.总结下经验,目的是开发一个稳定运行的固件,提高开发效率,提高运行

嵌入式linux C++语言(四)——类与对象

嵌入式linux C++语言(四)--类与对象 类的设计和使用如下: #include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>using namespace std;class Stack{public:    Stack(int size=1024);    ~Stack();    void init();    bool isEmpty();    bool