完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
一、最近的项目中用到了GSM模块,总结一下,模块型号是SIM800C,mcu还是stm32rtc6。
1、首先了解一下专业术语 SIM–用户识别码 GPRS–General Packet Radio Service, 通用分组无线电业务。GPRS是一种新的GSM数据业务,它可以给移动用户提供无线分组数据接入服务。GPRS主要是在移动用户和远端的数据网络(如支持TCP/IP、X.25等网络)之间提供一种连接,从而给移动用户提供高速无线IP和无线X.25业务。 GSM–Pan-European digital cellular land mobile telecommunication system ,泛欧数字蜂窝移动通信系统。 *GPRS相关AT指令集 GPRS指令 AT+CGATT=1 //返回OK,附着网络 AT+CGACT=1,1 //激活网络,之后就可以使用tcpip的指令了 AT+CREG?=1 //查询模块是否注册成功 TCP/IP指令 AT+CIPSTART=“TCP”,“121.41.97.28”,60000 //连接TCPIP服务器 AT+CIPSEND=20 //返回>,就可以输入要发送的内容20表示有20个字节 AT+CIPCLOSE //关闭TCPIP连接 +CIPRCV:5,12345 //收到服务器返回的5个字节 多路TCP/IP连接指令 AT+CGDCONT=1,“IP”,“cmnet” //设置PDP参数 AT+CGACT=1,1 //激活PDP AT+CIPSTATUS? //查询ip连接情况,共有8路,实际最多支持同时开4路tcpip连接 AT+CIPCLOSE //关闭该链路 AT+CIPMUX? //查询是否开启多连接 AT+CIPMUX=1 //开启多链接 AT+CGPADDR //显示PDP地址 ATD99**1# //请求GPRS服务 mcu通过串口发送相关AT指令控制sim模块 例子: //拨号流程 USART2_Init_Config(115200); //此模块使用的是串口2 if((UART2_SendString("AT+CREG?")); //查询模块是否注册成功 UART2_SendString("ATD13017688718;rn")//电话号可修改 //接听电话流程 USART2_Init_Config(115200); //此模块使用的是串口2 if((UART2_SendString("AT+CREG?")); //查询模块是否注册成功 { //注册成功 while(1) { if(find("CRING"||find("RING")) //查询串口接收数组中是否有这两个指令 { clear_buf(); //若有先清除串口接收缓存 UART2_SendString("ATArn");//接听来电指令 } delay_ms(1000);//每秒轮询检查一次 } } //接收发送短信语音等等也是同理,在此不做记录,项目中主要是用到了gprs,即通过ip地址进行数据传输。 首先总结下流程: 首先检查硬件 1、AT //检查串口模块 2、AT+CCID //检测是否插卡 硬件没问题了进行下面步骤(1到6步可以重复发送,直到成功为止 ) 1、第一步:AT+CSQ 查询网络信号质量 //返回值越大,信号越好 2、第二步:AT+CREG? 查询网络注册情况//判断返回值的第二个参数,为1或5则注册成功 3、第三步:AT+CGATT? 查询模块是否附着 GPRS 网络 4、第四步:AT+CSTT 设置APN 5、第五步:AT+CIICR 激活移动场景 6、第六步:AT+CIPSTART=“TCP”,“183.235.86.3”,1234 建立TCP/IP连接 // 测试时广东珠海公网动态IP:183.235.86.3 //若是udp直接改下就行AT+CIPSTART=“UDP”,“183.235.86.3”,1234 注意:第六步如果连接不成功,需要关闭连接再发起连接,先发送 AT+CIPCLOSE。如果一直不成功,检查服务器端口是否打开,若打开了,可以选择io口复位。 如果前面的步骤也一直不成功,直接io复位最快 代码: const char *string = "AT+CIPSTART="TCP","14.125.48.205",9015";//选择的是tcp USART2_Init_Config(115200); //此模块使用的是串口2 Second_AT_Command(u8 *cmd,u16 len,u8 *ack,u16 waittime);//这个函数封装了串口2发送指令及检查收到的数据 if((UART2_SendString("AT+CREG?")); //查询模块是否注册成功 { //注册成功,连接服务器 Connect_Server(); } void Connect_Server(void) { UART2_SendString("AT+CIPCLOSE=1"); //关闭连接 Delay_ms(100); Second_AT_Command("AT+CIPSHUT","SHUT OK",2); //关闭移动场景 Second_AT_Command("AT+CGCLASS="B"","OK",2);//设置GPRS移动台类别为B,支持包交换和数据交换 Second_AT_Command("AT+CGDCONT=1,"IP","CMNET"","OK",2);//设置PDP上下文,互联网接协议,接入点等信息 Second_AT_Command("AT+CGATT=1","OK",2);//附着GPRS业务 Second_AT_Command("AT+CIPCSGP=1,"CMNET"","OK",2);//设置为GPRS连接模式 Second_AT_Command("AT+CIPHEAD=1","OK",2);//设置接收数据显示IP头(方便判断数据来源,仅在单路连接有效) Second_AT_Command((char*)string,"OK",5); Delay_ms(100); clear_buf(); } 至此,gprs的驱动代码部分就算完成了,下面进行应用部分,收发函数及解析 u8 SIM800C_GPRS_SEND_DATA(u8 *temp_data,u16 size) { unsigned char Tx_Buf[32]="AT+CIPSEND="; To_STR(size,Tx_Buf+11);//将数字转换为字符串,用于计算发送的字符数 if(Second_AT_Command(Tx_Buf,sizeof(Tx_Buf),(u8 *)">")) return 1;//先发送长度帧指令 if(Second_AT_Command(temp_data,size,(u8 *)"SEND OK")) return 2; //再发送data return 0; } 注意:发送完GPRS长度帧后,返回字符’>’,接着发送数据帧,在模块返回"OK"之前,发送的数据都会被发送到服务器。即长度帧与数据帧要连着发,不能分开处理。 项目中一般发送数据后只要接收到ok状态码即可。在串口中断内还要判断是否有在线升级的指令,有的话还需要对数据包进行处理。此刻收集的传感器的数据包是停止发送的。 之后,在定时器中断内,每隔30秒发送一个数据包给后台。 //这个板作为数据中转用的,不光上传自己板上的数据,也上传其他板上的数据,与其他板间通信是通过cc2500模块实现的,下次总结。 void TIM3_IRQHandler(void) //TIM3中断函数 { static unsigned int times=7200; if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查中断标志位 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); // 清除中断标志位 (times%30)==0) { Second_AT_Command(heart_packet.buf,11); if(times >=7200) { if(SIM800C_CHECK_TCP_LINK())//检查连接 Soft_Reset; printf("TCP check ok!rn"); times = 0; } } if((times%300)==0) { TimeNow = RTC8563_ReadTime(); if(TimeNow.day == 0)Soft_Reset; // } else RTC8563_ADD_NS(&TimeNow,1); times++; //printf("Time_Now:%.2x %.2x:%.2x:%.2xrn",TimeNow.day,TimeNow.hour,TimeNow.min,TimeNow.sec); } } |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9000 浏览 16 评论
4051 浏览 18 评论
1109浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2302浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 10:06 , Processed in 1.613269 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号