基于STM32的SMS短消息收发系统

发布者:leader4最新更新时间:2012-12-31 来源: 电子设计工程 关键字:STM32  SMS短消息  收发系统  状态机 手机看文章 扫描二维码
随时随地手机看文章

    短消息服务(Short Message Senice)作为GSM网络提供给用户的一种基本的数字业务,已成为诸多领域远程监控的一种通信手段。在很多应用场合中都通过PC机直接控制短消息收发模块完成系统的数据采集或远程信息传输,但对于偏远地区、架设通信线路比较困难的地方,需要一种方便携带的设备控制短消息收发模块。系统通过在STM32上完成对短消息模块的控制,提出了一种嵌入式短消息收发系统的实现方法。
    本文讨论一类通用的SMS短消息收发系统的实现方法,包含短消息调度和SMS短消息处理控制器的实现机制,特别对STM32嵌入式微处理器下短消息收发调度的实现过程和短消息处理状态机进行了详细讨论。在嵌入式系统中,时间和并行性(concurrency)是必不可少的。通过对超时时间的控制和不同条件的切换,使得对短消息的收发处理在较小时间段内显示出并发特性。能够处理多条短消息同时控制的情况,具有良好的通用性。

1 系统的功能与结构
    SMS是GSM系统提供给广大移动用户的一种双向通信、具有一定的交互能力、占用GSM网络的信令信道的数字业务。SMS提供了在GSM移动站台(MS)与一个短消息实体(SME)之间通过服务中心(SC)传送短消息的方法。SC提供了在MS与SME之间消息传送的相互联系和转播的功能。SMS采用存储转发模式,短消息被发送出去之后,不是直接地发送给接收方,而是先存储在短消息服务中心,然后再由服务中心将其转发给接收方。如果接收方当时关机或不在服务区内,服务中心会自动保存该短消息,捧队并尝试再次发送给接收方。由于短消息使用了服务中心的这种存储和转发机制,因此SMS具有较高的可靠性。这也意味着GSM模块收发SMS的响应速度受运营商服务中心的限制。因此,要提高响应速度,需要一个持续在线的终端一直运行。
    系统在两个短消息实体间增加本地SMSC(短消息服务中心),通过SMSC完成短消息的解析并执行相应的动作、控制、无线通信功能。确保GSM终端模块持续运行,以提高响应速度。
    系统由TC35i GSM模块和运行在STM32微处理器上的短消息处理控制机两部分组成。TC35i负责短消息的收发。短消息处理控制机用来向GSM模块发送或读取TC35i收到的短消息,并执行相应的动作和控制。二者之间通过RS232串口实现数据交换。用户可以利用手机通过GSM网络和系统进行交互完成控制功能。

2 STM32片上资源的分配和使用
   
STM32是意法半导体基于Cortex—M3的32位嵌入式处理器,Cortex—M3核性价比高,价格低,可以与8位51核单片机竞争。
    处理器和GSM模块之间通过RS232串口实现数据交换,TC35i集成了标准的RS232接口,通过MAX232芯片做电平转换,与处理器USART接口进行通信。因此处理器需要提供两个串行通信接口,其中一个串口用于和GSM模块进行通信,另一个串口用于和上位机软件交换数据或调试。在处理器选型时需要考虑这个问题,而STM32全系列微处理器均能满足这个要求。系统选用的处理器型号为F103RBT6,该产品系列带有128k片内FLASH,20kRAM,无需外扩存储器即可以满足系统对于多条控制短消息同时处理耗费内存空间的需要。STM32F103RB带有3个USART接口,可以满足系统对串口资源的需求。芯片带有4个独立定时器,1个RTC实时时钟,系统只用到其中2路:1路用于产生较准确的系统延时,用于一般延时定时和状态切换超时判断。一路用于通过定时轮询方式读取短消息。GSM模块短消息收发和运行状态的监测通过USART的中断处理程序实现。

3 SMS短消息控制状态机的实现
   
由于系统旨在完成一类通用的SMS短消息控制机实现方法,因此在系统实现时从逻辑上将SMS提供方和使用方剥离,将发送子系统和接收子系统分离。这通过两个全局队列实现,发送队列和接收队列。
    定义一个结构体类型:
    a.JPG
    作为短消息的基本数据单元。
    并定义SMS_PDU类型的队列,分别作为发送队列和接收队列,即,SMS_PDU类型的结构体数组。如下:
    SMS_PDU m_QuerySend[MAX_SMS_SEND];
    SMS_PDU m_QueryRecv[MAX_SMS_RECV];
    以上定义均为全局队列。对全局变量的操作会涉及到并发和多线程访问技术,本系统考虑到实时性采用前后台系统实现方式,通过STM32多路定时和中断功能来完成多线程的模拟,主程序调用一个无限循环的控制器处理函数,在控制器循环中调用相应的驱动函数完成相应的功能。同时中断系统作为前台,遇到外部触发条件则立即构造短消息并加入到输出队列中。[page]

    对发送队列缓冲区的操作分为人队操作和出队操作,入队操作是由外部采集模块产生的中断事件,在该中断的处理例程中构造好具有发送具体内容PDU编码、目标手机号等资讯的结构体,并将构造好的结构体存放到发送队列中,此时一旦主程序中的短消息控制器在进行收发处理完毕后处于idle状态,将立即切换到开始发送状态,完成对发送队列中历史积累SMS的发送处理,在发送前首先进行出队操作。
    对接收队列缓冲区的操作也分为输入和输出部分。系统设定条件为一旦状态机处于idle状态达到5 ms时间(意味着发送队列中待发短消息已全部处理完毕)则状态切换到开始接收状态,即通过AT指令从模块读取短消息协议数据单元,解析为SMS-PDU格式并将其放入接收队列。输出部分主要通过定时器设置10 ms轮询,一旦有解析好的短消息到来,则马上控制被控设备产生相应动作。
    系统实现中,通过main函数调用短消息控制器循环运作状态迁移转换处理程序来实时完成与GSM模块的交互,通过TIM2中断处理例程完成对接收队列中已到达短消息的调度(dispatch)处理,该处理程序会根据接收到的短消息内容的不同来实现具体的控制功能。发送SMS时,也采用类似的中断方式和队列形式来完成多线程的模拟。为了防止对接收指令的误响应和减小与模块交互读取时间,每次接收短消息后都将GSM模块上已收短消息删除。
    系统采用状态机来实现不同状态处理的切换,过程中短消息数据收发的状态迁移图如图1所示。

d.JPG



4 STM32处理控制机与GSM模块的交互
   
STM32通过AT指令完成与GSM模块交互。与GSM模块交互读取短消息有多种方式,如AT+CMGR;AT+CMGL等。由于多个用户可以同时操作,考虑到可能到来的多条短消息,系统中使用CMGL AT指令完成STM32对GSM模块的通信操作,以便利一次读取,提高系统的响应速度。
    CMGL指令在SMS PDU mode下的格式如下:
    c.JPG
    SMS规范中定义了message_status的5种不同状态下的操作:
    0表示已接收到的未读短信,
    1表示已接收到的已读短信,
    2表示已存储的未发送短信,
    3表示已存储的已发送短信,
    4表示列出全部SMS短信。
    如果GSM模块成功从存储区读到短消息,将会返回到形如:
    b.jpg
    e.JPG
    格式的反馈信息。其中+CMGL后第一个1所在字段作为索引index,指示短消息在短消息存储区中的位置。注意这个位置小并不表明该短消息是先到达的控制短消息。第二个1所在的字段指示短消息的状态,同上述message_status的状态,但只有0~4的取值范围。24所在字段指示仅随其后的的TPDU编码的有效部分长度,以10进制表示。如果CMGL后面不加“=”号和任何数字,默认为“CMGL=0”的效果。系统中根据TPDU编码的内容进行解析,并将解析结果保存到一个临时SMS_PDU结构体类型的数据单元中。然后交由短消息处理状态机保存到队列中进行处理。

5 结束语
   
由于GSM模块收发SMS的响应速度受运营商服务的限制,短消息控制器的状态设计中需要把发送AT指令给模块和从GSM模块收到响应字符串区分为两种不同的状态,以及区分其它预备和执行状态,并利用MPU定时器产生精准毫秒延时来判定响应是否超时。但这只能提高状态切换精度,无法保证SMS服务响应的时间精度,即,系统必须等待GSM模块返回响应信息,这意味着系统实时性的高低瓶颈仍然取决与运营商。

关键字:STM32  SMS短消息  收发系统  状态机 引用地址:基于STM32的SMS短消息收发系统

上一篇:嵌入式Modbus/TCP网关的设计与实现
下一篇:基于Zigbee无线传感器网络的智能灯光跟随系统

推荐阅读最新更新时间:2024-03-16 13:15

stm32-esp8266驱动程序
esp8266模块是串口通讯,通讯的协议是AT指令,要正确的配置对应的AT指令模块才可以工作,这里就需要知道AT指令有没有配置成功,这个比较容易实现,一般发送AT指令配置成功的话,芯片都会返回至少一个OK,当然还有其它数据,我们只需要去解析有没有接收到OK就知道指令发送是否成功了。我这里是作为TCP客服端,所以只需要以下一些指令即可: 1 发送 ATrn 返回 OK 以上操作确保芯片连接正常,工作正常 2 发送 ATE0rn 返回 OK 关闭回显 3 发送 AT+CWMODE=1rn 返回 OK 设置成客服端模式 4 发送 AT+CIPSTATUS 返回 2 3 4 5 2
[单片机]
stm32-esp8266驱动程序
stm32的断言机制(assert)的理解
在做stm32的库程序移植时出现错误“#error Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file) ”,未选择STM32F4xx 设备导致多.h文件未被载入,发现是STM32F429_439xx的宏定义未定义,解决方法是在工具魔法棒 中的C/C++页的#define栏中添加相应的宏定义。 出现错误“.ObjectsSTM32F429IGT6_Demo.axf: Error: L6218E: Undefined symbol assert_param (referred from
[单片机]
<font color='red'>stm32</font>的断言机制(assert)的理解
使用STM32的射频模块以无线方式发送和接收数据
在嵌入式电子产品中制作无线项目变得非常重要和有用,因为没有杂乱的电线,这使得设备更加方便和便携。有各种无线技术,例如蓝牙、WiFi、433 MHz RF(射频)等。每种技术都有其自身的优缺点,例如成本、距离或范围传输、速度或吞吐量等。今天我们将使用STM32 的射频模块以无线方式发送和接收数据。 在这里,我们将连接一个 433MHz 射频无线模块与 STM32F103C8 微控制器。该项目分为两部分。发送器将与 STM32 连接,接收器将与 Arduino UNO 连接。发射和接收部分都会有不同的电路图和草图。 在本教程中,RF 发射器向接收器端发送两个值:使用超声波传感器测量的距离和电位计ADC值(0 到 4096),该
[单片机]
使用<font color='red'>STM32</font>的射频模块以无线方式发送和接收数据
STM32的ADC多路采集 DMA传输 数据错位
解决方法:不要采用连续转换模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; 需要时才实施转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); 转换后取消转换 ADC_SoftwareStartConvCmd(ADC1, DISABLE); 经过测试能够解决stm32 adc dma多通道采样 数据错位. DMA为循环模式更改为非循环模式,将开启DMA传输和开启ADC规则转换这两句话单独拿出。 每一次DMA传输都在特定条件下,由我们自己开启。在每一次DMA传输完成进入中断之前 都将AD转换器和DMA传输关闭,切换通道完成之
[单片机]
<font color='red'>STM32</font>的ADC多路采集 DMA传输 数据错位
STM32使用fsmc控制NOR flash 例程
一、基本概念(详细内容见st网站stm32应用笔记AN2784) 1. FSMC配置 控制一个NOR闪存存储器,需要FSMC提供下述功能: ●选择合适的存储块映射NOR闪存存储器:共有4个独立的存储块可以用于与NOR闪存、SRAM和PSRAM存储器接口,每个存储块都有一个专用的片选管脚。 ●使用或禁止地址/数据总线的复用功能。 ●选择所用的存储器类型:NOR闪存、SRAM或PSRAM。 ●定义外部存储器的数据总线宽度:8或16位。 ●使用或关闭同步NOR闪存存储器的突发访问模式。 ●配置等待信号的使用:开启或关闭,极性设置,时序配置。 ●使用或关闭扩展模式:扩展模式用于访问那些具有不同读写操作时序的存储器。 因为NOR闪存/SRA
[单片机]
STM32固件IAP升级实战
硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 1 预备知识 2 Bootloader 2.1 启动流程 2.2 校验跳转地址是否有效 2.3 Keil 工程 IAP 的相关设置 3 Application 3.1 启动流程 3.2 IAP 中的引导部分 3.3 关于 VTOR 3.4 Keil 工程设置 4 附件 1 预备知识 基于标准外设库(STM32F10x_StdPeriph_Lib_V3.5.0)的 IAP 升级相关资料可以参考 IAP ST 官方资料汇总。 STM32 升级的三种方式:IAP,ICP,ISP;具体有什么区别可以自行 Googl
[单片机]
STM32入门开发--LED模块实现跑马灯
1、案例描述 利用STM32F103ZE开发板实现控制LED灯实现跑马灯现象。 正在不断学习嵌入式开发中,博客还会持续更新,敬请关注! 2、开发环境 keil 5.14 + Windows 10 + FlyMcu 参考资料:STM32参考手册 3、实现原理 A.根据硬件接口图: 由接口图发现,开发板上面的两个LED分别接在PB5,和PE5接口处。即我们可以操作GPIO口的寄存器从而操作GPIO端口的控制器。 B、初始化(使能)PB,PE端口,查找手册发现端口PB,PE分别由APB2ENR端口的第三位和第六位控制。我们就将该位置1,其他位不变(|=操作) APB2ENR:外设时钟使能寄存器
[单片机]
<font color='red'>STM32</font>入门开发--LED模块实现跑马灯
ST推出业内互连性最好的STM32 F0微控制器
横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)进一步扩大基于ARM® Cortex™-M0 处理器内核的STM32 F0微控制器的产品阵容,新款产品支持下一代智能设备和联网产品的无晶振(Crystal-less)USB设计、精确感测和智能电源管理功能。 STM32F0x2新系列产品具有其它ARM Cortex-M0微控制器所不具备的功能,例如自校准时钟系统支持CAN和全速USB 2.0控制器,简化设计、节省外部电路。其它USB功能包括支持充电器检测和连接电源管理。其中充电器检测让电池供电装置能够更灵活地优化充电周期,而连接电源管理通过提升系统控制节
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved