单片机控制SIM模块实现GPRS联网是实现远程监控的基本方式。一般的做法都是通过串口发送AT指令来实现对SIM模块的控制。
原理虽然简单,但是要编写一套稳定、可靠的程序就要采用合适的设计思路,比如:发送AT指令后我们需要对AT指令的返回值进行断,如果采用固定延时的做法也未尝不可,但是有些情况下比如联网时CONNECT OK的返回时间就跟环境有很大关系,所以采用固定延时的做法编写的程序适应性很差。
还存在另一种情况,比如发送完AT指令后模块返回错误代码,这时候我们最好的做法就是重发,而不是略过。
基于上面这两点的考虑我采用了超时和重发的机制来保证程序的可靠性、适应性从而避免程序在执行错误之后出现崩溃。
下面讲一下我的具体思路:我采用的是STM8L系列的低功耗单片机控制SIM模块的,要实现超时和重发的机制,我们需要一个基础定时器和串口。从发送AT指令后开始开启定时器计时,设置一个最大定时值,在设定时间到来之前如果收到正确的返回值就跳出定时等待,否则在最大等待时间到来后跳出循环,执行有限次的重发,在这种实现策略中必须要设定定时器中断的优先级比串口接收中断优先级要低,以便实现中断嵌套。通过这种手段我们可以将超时值和重发次数作为函数入口参数,只要更改这两个值便可以增强程序的适应性和可靠性。
462629051_256703759 2013-9-6 09:12
allen_zhan_752827529 2013-9-5 12:57
allen_zhan_752827529 2013-9-5 11:20
allen_zhan_752827529 2013-4-9 13:34
用户1413766 2013-1-15 09:13
这是最基本的实现方式。
462629051_256703759 2013-1-7 17:16
allen_zhan_752827529 2013-1-7 16:42
462629051_256703759 2013-1-7 10:52
allen zhan你好,可能我的表述不太清楚,我所说的中断嵌套正如你所理解的,存在两个中断:定时器中断和串口接收中断,定时器中断的作用是超时时间的计数,用来监控串口是否在设定超时时间到来之前收到有效回应,要想实现这样的功能就需要同时开启串口中断和定时器中断,而且定时器中断优先级要低于串口中断,一旦判断出串口收到有效回应,就退出超时等待,这样的做法可以保证一定的实时性,而且只要修改超时时间就可以保证程序的适应性。至于重发则是由CPU来实现的,比如,一次超时到来之后没有收到有效回应,CPU启动重发程序,再次发送AT指令等待有效回应,至于超时值和重发次数的设置可以以环境条件而设置。最后我还有个全新的想法,为了提高程序的适应性,我们设置可以通过AT指令获取当前信道的拥堵情况,并以此构造一个超时值和重发值的拟合函数,保证程序可以自动判断超时值和重发次数,我曾利用AT+CSQ获取过信号电平,但是后来发现信号电平和信道拥堵并不成正比,所以由信号电平来决定超时值和重发次数并不非常合理,也希望各位网友如果有更好的主意可以共同讨论!
用户1241444 2013-1-5 15:29
用户557499 2013-1-5 12:29