最近有个朋友问我单片机如何与手机进行通信,于是我就整理了一篇图文教程发给他,顺便分享给大家。我们用单片机做产品的时候一般都会遇到单片机要和手机通信的情况,所以今天我们就来学习一下如何用单片机和手机进行通信。
中国联通的GSM网是向社会公众提供通信服务的公用通信网,是目前基于时多址技术的移动通信体制中,较成熟完善的也是应用最广泛的一种系统,是我国公众移动通信网的主要方式。
这个系统是由数据接收和发送部分、数据采集部分、终端处理部分三个方面组成。
现在我们就来讲讲单片机如何与手机进行交互。
整个系统中,三个部分是互相独立的,但是彼此又相互依赖,共同完成数据的传输。数据收发模块在系统中起着承上启下的作用,是系统的核心模块。这个模块以双单片机为核心,用RS232通信接口,在物理层上实现与GSM模块的连接。
现在介绍一下它的工作原理是怎样的
串口控制SMS的工作原理
单片机与GSM模块一般是采用串行异步通信接口,通信速度可以进行设定,一般为19200bps。采用这种RSM232电缆方式进行连接时,传输数据的可靠性比较好,通过串行接口集成电路和电平转换电路与GSM模块进行连接,电路相对来讲比较简单,其中所涉及的芯片包括单片机89C51与电平转换芯片MAX232,这是很常见的接口电路。需要注意的是,这个接口通过IIC总线扩展了一个EEPROM存储器,主要的作用是存储数据,而且断电后信号也不会丢失,这些特性是正式存储数据所必须的。
当前市场上很多手机都支持GSM7.05规定的AT指令集,该指令集是欧洲通信技术委员单位发布的,其中就有包含对SMS的控制,通过GSM手机的串行接口,单片机向手机发布一系列的AT指令,就可以控制GSM模块收发SMS的目的。这里需要注意的是用单片机实现时,编程必须要注意它发送指令与接收到的相应字符都是ASCII码。
软件实现的流程讲解
上位机模块和下位机模块半双工通信协议的实现
重发和应答
上位机模块和下位机模块的通信双方是遵照半双工通信方式进行的,它的数据传送是双向的,但是任何时刻只能由其中一方进行数据发送,另一方是数据接收,因为EEPROM的写入和读出是不可以同时进行的,同时为了避免一方在发送信息帧时,另一方也会发送数据,所以必须要把信道变成半双工方式,虽然这样效率不如全双工方式,但是可以把模块的工作性能稳定。双方数据发送的顺序是:发——收到且应答——再继续发。
按照这个系统的思路设计,上位机模块发送的帧包括确认帧、非确认帧与命令帧;下位机模块发送的帧包括确认帧与非确认帧及数据帧。其中确认帧和非确认帧发送数据以后待对方回应发送的应答帧,一次作为继续发送下一帧和重新发送上一帧的依据。命令帧和数据帧同时发送信息帧,当一方发送完成信息帧后,如果接收方收到对方的信息帧而又没有信息帧需要发送,那么这种情况就比较简单了,接收方会根据信息帧的正确与否以此决定发送确认帧还是非确认帧,对方也可因此决定是重新发送还是继续发送,如果此刻接收方也有信息帧的应答帧,那么收方将不立即发送应答帧,而是马上发送本方的信息帧给对方,在收到对方的应答帧后,接收方将依据应答帧的内容决定是继续发送下一信息帧还是重新发送原来的信息帧。
延时重发
双方在通信的过程当中,有两个时间T1和T2分别表示重新发送信息帧的最大延时,T2表示一方发送信息帧收到对方的应答帧的时间,如果等待应答帧的时间超过了T1,则发送会重新发送原来的信息,当收方接收到对方发送的信息帧,如果对方这时候还有继续要发送的信息帧,接收方此时是不发送应答帧的,而是发送信息帧给对方。这种情形就是说,利用对方等待接收方应答帧的时间在T1内,接收方插入发送本方的信息帧,一样本方发送的信息帧也有一个延时重发的问题。
在规定的时间内,如果没有收到对方应答帧,接收方同样也需要将原来的信息帧重发,规定的这个时间就是T2,很明显接收方是利用时间间隙来发送本方的信息帧的,所以TIT2。
程序设计
主函数的设计思路
开机上电之后,程序在函数中运行,GSM模块和单片机分别会进行初始化,单片机的初始化包括设置串口的工作方式,波特率,并初始化变量和标志位,GSM模块初始化包括有关闭回显、重新启动、设置在TEXT模式下的返回值中不显示详细的头信息,选择的短信的格式也包括TEXT模式,并且发串口中断准备数据接收。
GSM返回函数的处理,用于处理GSM模块返回参数的SHELL函数
SHELL是进入时钟中断程序时被调用时,该函数是对GSM模块返回的参数进行处理的函数,根据系统设计的要求,GSM模块需要进行以下操作:呼叫对方模块号码、阅读短信、删除短信、发送数据。基于以上的各种操作指令,操作如果成功GSM模块会分别返回不同的参数:+CMGR、+CMGS、>、OK。根据收到各种不用参数,下位机模块会转向不同的操作步骤,以此来判断并改变标志位的值。
处理不同的短信数据——EXECDATA函数
进入时钟中断调用SHELL函数时,如果可以接收到返回的参数+CMTI,就表示了上位机模快向下位机发送了短信数据,这个数据可能是命令帧,也可能是确认帧或者非确认帧。一般在这种情形下,SHELL函数需要对短信内容进行分析,并且根据不同的短信内容进行处理,负责完成以上短信数据处理的功能就是EXECDATA函数,EXECDATA函数是被SHELL函数调用的,主要是用于分析和处理短信数据的。
更多关于单片机与手机交互请关注昇润科技公众号:Tunercom168