此GSM模块采用SIMCOM 公司的工业级四频 850/900/1800/1900MHz SIM800 芯片, 可以低功耗实现语音、SMS、数据和传真信息的传输。 可以运用到短信监控二氧化氮、短信监控烟雾报警器、无线终端(短信猫)、 工业监测与控制(温湿度、二氧化碳) 、远程抄表系统 、 智能家居控制系统等控制平台。 1.1 接线图:
引脚名称 | | | | | | | | | 连接单片机板子的电压 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灯闪的状态
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 Ini tialization...\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;"); 可以改成你要拨打的号码,注意号码后面的分号不要漏了。 |