OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7211|回复: 5

sim900A GPRS通信问题

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-8-14
在线时间
0 小时
发表于 2014-8-14 15:08:53 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true] void GSM_Send(u8 *SendData) { while(*SendData) { USART_SendData(USART3,*SendData++); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET); } } int main(void) { u8 *Msg0,*Msg1,*Msg2,*Msg3,*Msg4,*Msg5,*Msg6,*Msg7,*Msg8,*Msg9; u8 *Ms0,*Ms1; delay_init(); NVIC_Configuration(); uart_init(9600); Msg0="AT+CGCLASS=\"B\"\r"; Msg1="AT+CGDCONT=1,\"IP\",\"CMNET\"\r"; Msg2="AT+CGATT=1\r"; Msg3="AT+CIPCSGP=1,\"CMNET\"\r"; Msg4="AT+CLPORT=\"UDP\",\"3001\"\r"; Msg5="AT+CIPSTART=\"UDP\",\"219.243.50.199\",\"8086\"\r"; Msg6="AT+CIPSEND\r"; Msg7="FIX it"; Msg8="AT+CIPCLOSE=1\r"; Msg9="AT+CIPSHUT\r"; // GSM_Send(Msg8); // delay_ms(100); // GSM_Send(Msg9); // delay_ms(100); GSM_Send(Msg0); delay_ms(1000); GSM_Send(Msg1); delay_ms(1000); GSM_Send(Msg2); delay_ms(500); GSM_Send(Msg3); delay_ms(500); GSM_Send(Msg4); delay_ms(500); GSM_Send(Msg5); delay_ms(2000); GSM_Send(Msg6); delay_ms(1000); GSM_Send(Msg7); delay_ms(200); USART_SendData(USART3, 0x1A);//向串口3发送数据 delay_ms(500); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束 delay_ms(100); while(1); } [/mw_shl_code]
在注释掉发送msg8和msg9之后程序可以自动运行,但是加上msg8和msg9之后程序单步可以运行,完整运行就不行了,发不了数据。是不是延时的问题,我改过好多次了,每一步的延时都改过了,可惜就是不行,请求原子大哥帮忙看看,小弟真的束手无策了,同时也请求其他广大高手来指点。谢谢!

最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=c,true]//sim900a发送命令后,检测接收到的应答 //str:期待的应答结果 //返回值:0,没有得到期待的应答结果 // 其他,期待应答结果的位置(str的位置) u8* sim900a_check_cmd(u8 *str) { char *strx=0; if(USART3_RX_STA&0X8000) //接收到一次数据了 { USART3_RX_BUF=0;//添加结束符 strx=strstr((const char*)USART3_RX_BUF,(const char*)str); } return (u8*)strx; } //向sim900a发送 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-8-14 15:08:54 | 显示全部楼层
[mw_shl_code=c,true]//sim900a发送命令后,检测接收到的应答 //str:期待的应答结果 //返回值:0,没有得到期待的应答结果 // 其他,期待应答结果的位置(str的位置) u8* sim900a_check_cmd(u8 *str) { char *strx=0; if(USART3_RX_STA&0X8000) //接收到一次数据了 { USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符 strx=strstr((const char*)USART3_RX_BUF,(const char*)str); } return (u8*)strx; } //向sim900a发送命令 //cmd:发送的命令字符串(不需要添加回车了),当cmd<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串. //ack:期待的应答结果,如果为空,则表示不需要等待应答 //waittime:等待时间(单位:10ms) //返回值:0,发送成功(得到了期待的应答结果) // 1,发送失败 u8 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime) { u8 res=0; USART3_RX_STA=0; if((u32)cmd<=0XFF) { USART_SendData(USART3,(u32)cmd); }else u3_printf("%s\r\n",cmd);//发送命令 if(ack&&waittime) //需要等待应答 { while(--waittime) //等待倒计时 { delay_ms(10); if(USART3_RX_STA&0X8000)//接收到期待的应答结果 { if(sim900a_check_cmd(ack))break;//得到有效数据 USART3_RX_STA=0; } } if(waittime==0)res=1; } return res; } [/mw_shl_code]






[mw_shl_code=c,true] //查看SIM900A模块的状态。 //返回值: // 1: 发送AT指令出错 // 2: SIM卡出错。 // 3: 查询不到运营商 u8 sim900a_check_status(){ if(sim900a_send_cmd("AT","OK",200)) return 1;//发送AT指令,判断返回是否是OK。 if(sim900a_send_cmd("AT+CPIN?","OK",200)) return 2;// 检查SIM卡失败。。。没有插入SIM卡。 if(sim900a_send_cmd("AT+CGMI","OK",200))return 3;//查询不到运营商; return 0; } //SIM900A拨号测试 //其中sprintf是字符串格式化函数 //sprintf函数使用请参考http://baike.baidu.com/view/1295144.htm u8 sim900a_call_test(u8* msisdn) { u8 status=0; char cmd[20]; status=sim900a_check_status(); if(status) return status; if(sim900a_send_cmd("AT+CLIP=1","OK",200))return 4; //设置来电显示 if(sim900a_send_cmd("AT+COLP=1","OK",200))return 5; //设置被叫号码显示 sprintf((char*)cmd,"ATD%s;",msisdn);//命令格式:ATDXXXX; if(sim900a_send_cmd((u8*)cmd,"+COLP:",200)) return 6;//拨号失败 return 0; }[/mw_shl_code]


我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-8-14 21:52:52 | 显示全部楼层
你只发送不检测接受,,,,说不定就卡在哪里了。难说。。。
要接受了分析。。。
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-8-14
在线时间
0 小时
 楼主| 发表于 2014-8-15 10:00:54 | 显示全部楼层
谢谢原子哥,问题暂时得到解决。
回复

使用道具 举报

16

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-9-16
在线时间
2 小时
发表于 2014-10-11 22:03:51 | 显示全部楼层
回复【4楼】333333lee:
---------------------------------
你好,你的问题是怎么解决的?我也遇到了同样的问题
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-8-14
在线时间
0 小时
 楼主| 发表于 2014-10-16 09:04:30 | 显示全部楼层
[mw_shl_code=c,true]GSM_Send(Msg0); delay_ms(2000); GSM_Send(Msg1); delay_ms(2000); GSM_Send(Msg2); delay_ms(2000); GSM_Send(Msg3); delay_ms(2000); GSM_Send(Msg4); delay_ms(2000); GSM_Send(Msg5); delay_ms(2000); GSM_Send(Msg6); delay_ms(2000); GSM_Send(Msg7); delay_ms(2000); USART_SendData(USART3, 0x1A);//向串口3发送数据 delay_ms(2000); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束 delay_ms(2000); // GSM_Send(Msg8); // delay_ms(500); // GSM_Send(Msg9); // delay_ms(500);[/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true]这个是我时间修改的,你可以试试。主要还是 4 5 两条消息的延时问题。你慢慢试可以试出来的,我当貌似到了60000ms。他就开始自己启动了。后续我就把时间简短。也是可以的,不过最终有个界限。我也忘发了是多少了。其实我对这些也不是很懂。共勉吧![/mw_shl_code]
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 12:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表