MSP430 ApplicationTwo(original)
0赞这篇应该是写一点关于MSP430来操作GSM模块的认识。
我没有拆过手机,但在我的认识上,应该和一块单片机开发板有些相似。无非是我们的手机里面用的处理器是块ARM的,能跑个高级一点的操作系统,但是貌似现在的操作系统高级了,手机自己都有点不知道怎么定义自己了,暂且扣上个智能的前缀吧。从手机中的那块芯片需要通过一些嵌入式的程序来驱动其他的一些模块来工作这个方面看,手机和单片机开发板是一样的。那么我们现在就来用MSP430单片机来驱动GSM模块来实现一些手机的功能,比如发短信和打电话。之前见过一张很形象的图片,找不到了,该收藏起来的,我们就暂且把MSP430+GSM模块当做个显示屏坏了的手机吧。
就像SQL语言是嵌入在其他的主语言里面来实现的对数据库操作一样,我们要对GSM进行操作需要使用到嵌入到C语言中的AT指令。
AT指令有好多条的样子,下面我们引用几条见识一下。
1.设置短消息中心
AT+CSCA=“+8613800270500”回车(具体的号码由当地的运营商决定。)
2.接收短消息
+CMTI:“SM”,X (X表示接收短消息的SIM卡存储号码)
AT+CMGR=X回车(从X存储区读短消息)
AT+CMGD=X回车(从X存储区删除短消息)
3.发送短消息
AT+CMGF=1回车(采用文本格式发送,如用PDU格式,则AT+CMGF=0)
AT+CMGS=“+8613xxxxxxxxx”回车
>输入短消息。Crtl+Z结束并发送。
4.重要的指令
ATZ;E 回车Echo OFF
ATZ;E1回车Echo ON
AT+CREG?回车回答x(X=2脱网,X=1注册,X=0状态不明)
AT+COPS?回车表示SIM卡是否被网络接受
AT+COPS=?回车显示所有可用的网络。
5.建立语音呼叫
AT+CREG?回车(是否网络注册)
ATD13xxxxxxxxx;回车(语音呼叫和数据呼叫建立的区别在于号码后所接的分号上)
6.改变并保存参数
AT+IPR=2400 回车(改变RS232口的速率至2400bps)
AT&W 回车(保存已改参数)
7.输入PIN码
AT+CPIN=“xxxx”
8、关机
AT+CPOF OK
9、开机
AT+CFUN
我们需要注意一下AT+CMGF=1这条短信发送模式选择语句,现阶段发送短消息常用的模式是Text和PDU模式。使用Text模式收发短信代码简单,实现起来比较容易,但最大的缺点是不能直接收发中文短信,如果想要首发的话需要另外进行码制转换;而PDU模式不仅支持中文短信,也能发送英文短信,国内一般用的是这种模式,但是就是发送的数据编码有点麻烦,要花点时间去理解一下。
那么在用430进行操作之前,我们可以直接将GSM模块通过串口连接到PC机上,通过串口调试助手,发送AT指令来直观的感受一下。
我们需要输入发送的指令然后回车,点发送来向GSM模块发送指令,要注意一下AT指令的特别之处,不然发送接收数据方面就会比较麻烦。
如果我们将串口调试助手所作的事情由430单片机来做的话,我们就可以实现使用单片机来控制GSP模块。下面我们给出一些操作实例。
#include <msp430x14x.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
#define GPRMC_Buf_Len 100
char GPRMC_Buf[GPRMC_Buf_Len] = {0};
char UART1_RX_BUF[256] = {0};
int UART1_RX_Len=0 ;
int flag=0;
int UART0_RX_Len=0;
char UART0_RX_BUF[16]={0};
void UART_Init(void) ;
void ATH(void);
void GSMtest(void);
void CMGF(void);
void CMGS(void);
void delay( int ms);
/********************主函数********************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
UART_Init() ;
while(1)
{
LPM1;
ATH();
delay(8000);
GSMtest();
CMGF();
CMGS();
UART0_RX_Len=0;
memset(UART0_RX_BUF,0,16);
delay(20000);
IE1 |= URXIE0;
}
}
void UART_Init(void)
{
P3SEL |= 0xF0;
ME1 |= UTXE0 + URXE0;
UCTL0 |= CHAR;
UTCTL0 |= SSEL0;
UBR00 = 0x03;
UBR10 = 0x00;
UMCTL0 = 0x4A;
UCTL0 &= ~SWRST;
IE1 |= URXIE0;
ME2 |= UTXE1 + URXE1;
UCTL1 |= CHAR;
UTCTL1 |= SSEL0;
U1BR0 = 0x03;
U1BR1 = 0x00;
U1MCTL = 0x4A;
UCTL1 &=~ SWRST;
IE2 |= URXIE1;
_EINT();
}
void ATH(void)
{
char codetest[5]= {'A','T','H',0X0D,0X0A};
UART0_SendStr_char(codetest,5);
//delay(4000);
}
void GSMtest(void)
{
char codetest[4]= {0x41,0x54,0x0D,0X0A};
UART0_SendStr_char(codetest,4);
delay(6000);
}
void CMGF(void)
{
char CMGF[11 ]={'A','T','+','C','M','G','F','=','1',0X0D,0X0A}; //AT+CMGF=1回车
UART0_SendStr_char(CMGF,11);
delay(6000);
}
void CMGS(void)
{
char CMGS[23]={'A','T','+','C','M','G','S','=',0X22,'1','5','8','6','9','0','2','8','2','3','4',0X22,0X0D,0X0A};
UART0_SendStr_char(CMGS,23);
delay(1000);
UART0_SendStr_char(GPRMC_Buf,60);
delay(500);
TXBUF0=0x1A;
}
void UART0_SendStr_char( char *pBuffer, int n_byte)
{
int q0;
for(q0=0;q0<n_byte;q0++)
{
while((IFG1&UTXIFG0)==0);
TXBUF0=*pBuffer;
pBuffer++;
}
}
void delay(int ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}