迅维网

查看: 22456|回复: 2
打印 上一主题 下一主题

分享GSM(SIM800)模块的使用

[复制链接]
跳转到指定楼层
1#
发表于 2016-12-7 15:35:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 来自: 山东青岛 来自 山东青岛

马上注册,获取阅读精华内容及下载权限

您需要 登录 才可以下载或查看,没有帐号?注册

x
      此GSM模块采用SIMCOM 公司的工业级四频 850/900/1800/1900MHz  SIM800 芯片, 可以低功耗实现语音、SMS、数据和传真信息的传输。 可以运用到短信监控二氧化氮、短信监控烟雾报警器、无线终端(短信猫)、 工业监测与控制(温湿度、二氧化碳) 、远程抄表系统 、 智能家居控制系统等控制平台。
1.1  接线图:

                               
登录/注册后看高清大图


引脚名称
功能
T_RX
连接单片机的UART_RX
T_TX
连接单片机的UART_TX
GND
连接单片机的GND
V_MCU
连接单片机板子的电压 5v 或者 3.3v,会让 T-RX 和 T-TX 引脚电平逻辑和 V_MCU 一致若接的 5v,则 T-RX 和 T-TX 引脚逻辑电平为 5v;若接的 3.3v,则 T-RX 和 T-TX 引脚逻辑电平为 3.3v;
该引脚是单片机板子的电压引脚对 GSM 模块的 TTL 逻辑电平的调整,并不能作为 GSM 模块的供电来使用。



                               
登录/注册后看高清大图


       开发板和GSM模块需要4根线来连接,按照我们前面提供的接线图连好即可。我们还需要一张移动或联通的SIM卡(不支持电信卡),如果你的是micro SIM卡,也没有卡套,是不是不能用了?
        当然不是,只要我们把micro SIM卡的金属接触点和模块上的SIM卡槽的接触点对好就行。
        线和SIM卡都接好后,我们需要给开发板和GSM模块供电。要注意的是,开发板是5V的电源,而GSM模块是9V的电源,使用是要特别留意两者的接头,不要搞混了,因为如果开发板接了9V的电源的话,会烧坏开发板。
我们目前提供了4个演示程序,分别是:F429_GSM_短信收发、F429_GSM_通话、F429_GSM_中文短信收发、F429_GSM_GPRS ;因和GSM模块通信都是发AT指令,代码没有什么难理解的地方,所以这里我就简单介绍下这几个例程实现的功能及要注意的地方。
        GSM模块和红龙429是通过UART6通信,为了方便我们前期调试的时候看到GSM返回的信息,我们用了USART1来转发UART6接收到的数据。

1.2  启动GSM模块
        给GSM模块接上9V1A的电源后,按下模块上的开关,电源接口旁边的指示灯亮起,说明通电正常,然后需要按下GSM模块上的PWR_KEY按键1秒以上。
         烧写(F429_GSM_短信收发)程序到开发板,用micro-USB线连接板子J3的USB口,打开串口调试助手。

                               
登录/注册后看高清大图

      如果串口打印显示发AT指令返回OK,并能读取信号强度和当前运营商,说明GSM模块和我们的开发板之间的通信是没问题了。若串口打印出---SIM800无响应,请检查后重新启动,可以通过以下几种方式来排除问题。

1)检查GSM模块上串口旁边的两个跳线位置,下图的连接才是正确的。


                               
登录/注册后看高清大图

2)观察LED灯闪的状态

LED灯闪状态
SIM800工作状态
熄灭
SIM800没有工作
60ms 亮/800ms   熄灭
SIM800 没有找到服务(GSM 卡无服务)
60ms 亮/3000ms 熄灭
SIM800 连接到服务信号
60ms 亮/300ms   熄灭
SIM800 正在 GPRS 通讯
      3)检查下这个SIM卡和我们模块的金属接触点,如果是micro SIM卡的用户,可以找个卡套,排除接触不良的情况;
问题都排除后,并能打印出正常的开机信息,就可以收发短信了。

1.3  收发英文短信
     用其他手机给我们模块上的号码发送一条纯英文的短信,模块收到后,板子上的蜂鸣器会鸣叫一声,表示收到了新短信,这时,我们可以按下开发板的S3按键,来读取上一次收到的新消息。


                               
登录/注册后看高清大图
      实验前注意,程序里填写的是我们测试的号码,你在使用的时候,需要号码改成自己的,编译后再烧写到开发板验证。
     代码位于工程中的SIM_800.c

1. /**
2.   * @brief  发送短信
3.   * @param  None
4.   * @retval   None
5.   */
6. void SIM800_SendSMS(void)
7. {                                                                                                   //短信发送测试      
8.                                         //CSM字符集和文本模式 在前面设置过,无需重复设置

9.         char *sendSMS="welcome to xxx.openmcu.xxx";
10.         if(SIM800_Cmd("AT+CMGS=\"13534298280\"",">",NULL,500)!=0)   
11.                                                                             //注意,改成收信人的号码,可以自己发给自己
12.          {
13.                                                               //返回>时就可以输入要发送的内容
14.              USART6_Send_Data((u8*)sendSMS,strlen(sendSMS));                                                   
15.       printf("\r\n启动发送\r\n");                                                         
16.              USART_SendData(USART6,STARTSEND);                          //启动发送
17.              printf("\r\n发送完成\r\n");
18.          }
19. }
      如果找不到其他手机来测试,可以把上面函数SIM800_SendSMS 中的SIM800_Cmd("AT+CMGS=\"xxxxxxxxxxx\"",">",NULL,500),改成自己的手机号码,实现自发自收。
1.4  收发中英混合短信
     中文短信,因为中文短信都是采用Unicode编码,为了能在串口调试助手中直观的看到短信内容,我们在程序里放置了Unicode to  BGK转换表(约占27KB的ROM空间),大概有6000多个常用汉字。

                               
登录/注册后看高清大图






                               
登录/注册后看高清大图



                               
登录/注册后看高清大图


      从上图可以看到,SIM800直接返回的是Unicode码,无法直接阅读短信内容,在经过程序处理后,就可以显示中文的短信内容了。程序目前实现的是Unicode to BGK ,没有实现BGK to Unicode,所以,要发送中文短信,需把要发送的短信内容和收件方的手机号码通过软件转换成Unicode。
1. /**
2.   * @brief  发送中文短信
3.   * @param  None
4.   * @retval   None
5.   */
6. void SIM800_SendSMS_CN(void)
7. {                                                                         //短信发送测试  全部按Unicode编码      
8.                                                                        //文本模式在前面设置过,无需重复设置
9.
10.
11.
12.
13. char*sendSMS="0063006F006D0065002000660072006F006D00206DF1573365FA5B9D75355B50";                                                             //come from 深圳旺宝电子                  

14. Char*phoneNum="AT+CMGS=\"00310033003500330034003200390038003200380030\"";                                                                      //使用时替换成自己的号码
15.         if(SIM800_Cmd(phoneNum,">",NULL,500)!=0)           //注意,改成收信人的号码,可以自 己发给自己做测试
16.          {
17.                                                                            //返回>时就可以输入要发送的内容
18.        USART6_Send_Data((u8*)sendSMS,strlen(sendSMS));                                                   
19.        printf("\r\n启动发送\r\n");                                                         
20.               USART_SendData(USART6,STARTSEND);                          //启动发送
21.               printf("\r\n发送完成\r\n");
22.          }
23. }




                               
登录/注册后看高清大图


Copy到代码里时要手动去掉空格。

1.5  语音通话
1.int main(void)
2.{  
3.//        LED_Init();
4.        Key_Init();
5.        BEEP_Init();
6.        USART1_Init();
7.        USART6_Init();
8.        printf("\r\n");
9.        printf("Hello Welcome.\r\n");
10.        printf("Thank You For Choosing Our Products.\r\n");
11.        printf("Thank You Very Much.\r\n");
12.        printf("This Example GSM module call test.\r\n");
13.        printf("\r\n");
14.        printf("SIM800 Initialization...\r\n");                    
15. printf("Ok,Let's Go...\r\n");      
16.      
17. SIM800_Init();
18.        printf("\r\n按S2接听电话,按S3拨打电话\r\n");     
19.  while (1)
20.        {
21.            if(findstring((char*)rx_bufferu6, "RING",4))//检查是否有来电标志
22.             {
23.                BEEP_Toggle(2,300);                                 //提示
24.              }
25.                       
26.                 
27.             if(data_length)
28.              {
29.          delay_ms(10);               
30.          switch(rx_buffer[0])
31.           {
32.                               case  '1':SIM800_Cmd("ATA","OK",NULL,500);             //接听
33.                             memset(rx_bufferu6,0x00,DATA_BUF_SIZE);
34.                             break;
35.                                case '2':SIM800_EndCall();                                            //挂断
36.                             break;
37.                          }                              
38.                       data_length = 0;
39.              }                       
40.              if(data_lengthu6)
41.                {
42.                           delay_ms(10);                                               
43.                           USART1_Send_Data(rx_bufferu6,data_lengthu6);      
44.                           data_lengthu6 = 0;      
45.                }
46.              if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_11))      //S3按下,拨打电话
47.               {
48.                          delay_ms(20);
49.           if(!(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_11)))
50.              {
51.                        SIM800_Call("10086;");               //拨打电话,注意,号码后面要加分号               
52.               }                                                                              
53.           }                                                         
54.            if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))        //S2按下,接听电话
55.             {
56.                 delay_ms(20);                                          
57.                 if(!(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)))   //按键松开?
58.             {               
59.                                SIM800_Answer();                                                 //接听电话                                                                  
60.              }
61.              }
62.    }
63.}

     模块上有两个接口,要测试语音通话功能,需要 将耳机插到如下图的位置。

                               
登录/注册后看高清大图
      从前面的代码可以看到,当GSM启动信息正常后,如果你要接听来电,可以按下开发板S2,用其他手机给SIM卡上的号码拨号,开发板的蜂鸣器会鸣叫一声,表示有新来电,然后可以在串口调试助手中输入1来接听电话,输入2挂断电话。如果是拨打电话,按下开发板的S3, 程序默认拨打的是10086,SIM800_Call("10086;");     可以改成你要拨打的号码,注意号码后面的分号不要漏了。


2#
发表于 2017-2-6 17:16:07 | 只看该作者 来自: 山西吕梁 来自 山西吕梁
经典东西 值得学习

点评

对,非常经典的模块,发上来让大家学习一下,论坛这方面的资料相对来说很少.  详情 回复 发表于 2017-2-7 07:23
回复 支持 反对

使用道具 举报

3#
发表于 2017-2-7 07:23:31 | 只看该作者 来自: 中国 来自 中国
bzp818 发表于 2017-2-6 17:16
经典东西 值得学习

对,非常经典的模块,发上来让大家学习一下,论坛这方面的资料相对来说很少.

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表
附近
店铺
微信扫码查看附近店铺
维修
报价
扫码查看手机版报价
信号元
件查询
点位图 AI维修
助手



芯片搜索

快速回复