OpenEdv-开源电子网

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

SIM900A模块代码问题,我是新手,各位大神。

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-20
在线时间
12 小时
发表于 2018-3-4 21:02:22 | 显示全部楼层 |阅读模式
1金钱
SIM900A模块代码的拓展例程中,GPRS模块sim900a_tcpudp_test代码是怎么实现发送数据的,其中的p1中的发送内容是怎么获得的?
while(1)
        {
                key=KEY_Scan(0);
                if(key==WKUP_PRES)//退出测试                 
                {  
                        sim900a_send_cmd("AT+CIPCLOSE=1","CLOSE OK",500);        //关闭连接
                        sim900a_send_cmd("AT+CIPSHUT","SHUT OK",500);                //关闭移动场景
                        break;                                                                                                 
                }else if(key==KEY0_PRES&(hbeaterrcnt==0))                                //发送数据(心跳正常时发送)
                {
                        Show_Str(30+30,80,200,12,"数据发送中...",12,0);                 //提示数据发送中
                        if(sim900a_send_cmd("AT+CIPSEND",">",500)==0)                //发送数据
                        {
                                printf("CIPSEND DATA:%s\r\n",p1);                                 //发送数据打印到串口
                                u3_printf("%s\r\n",p1);                                                                              我想知道这里的p1的内容怎么获得的?
                                delay_ms(10);
                                if(sim900a_send_cmd((u8*)0X1A,"SEND OK",1000)==0)Show_Str(30+30,80,200,12,"数据发送成功!",12,0);//最长等待10s
                                else Show_Str(30+30,80,200,12,"数据发送失败!",12,0);
                                delay_ms(1000);
                        }else sim900a_send_cmd((u8*)0X1B,0,0);        //ESC,取消发送
                        oldsta=0XFF;                       
                }

QQ截图20180304205602.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-3-5 00:54:32 | 显示全部楼层
看其他地方的代码,你这里截图出来的,是没有给 p1赋值的地方!
回复

使用道具 举报

5

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2017-2-19
在线时间
53 小时
发表于 2018-3-5 08:59:20 | 显示全部楼层
我记得原子出过一个简易代码,就是SIM900A模块,我有用过,然后再在那个简易代码里面加东西,那个你只要把AT指令搞清楚,一般的任务都可以做出来的
回复

使用道具 举报

62

主题

902

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3555
金钱
3555
注册时间
2016-1-8
在线时间
543 小时
发表于 2018-3-5 09:33:33 | 显示全部楼层
这和sim900a没关系吧
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-20
在线时间
12 小时
 楼主| 发表于 2018-3-5 09:35:16 | 显示全部楼层
正点原子 发表于 2018-3-5 00:54
看其他地方的代码,你这里截图出来的,是没有给 p1赋值的地方!

能在帮我看看吗,是不是在这代码里面?
void sim900a_tcpudp_test(u8 mode,u8* ipaddr,u8* port)
{
        u8 *p,*p1,*p2,*p3;
        u8 key;
        u16 timex=0;
        u8 count=0;
        const u8* cnttbl[3]={"正在连接","连接成功","连接关闭"};
        u8 connectsta=0;                        //0,正在连接;1,连接成功;2,连接关闭;
        u8 hbeaterrcnt=0;                        //心跳错误计数器,连续5次心跳信号无应答,则重新连接
        u8 oldsta=0XFF;
        p=mymalloc(SRAMIN,100);                //申请100字节内存
        p1=mymalloc(SRAMIN,100);        //申请100字节内存
        LCD_Clear(WHITE);  
        POINT_COLOR=RED;
        if(mode)Show_Str_Mid(0,30,"ATK-SIM900A UDP连接测试",16,240);
        else Show_Str_Mid(0,30,"ATK-SIM900A TCP连接测试",16,240);
        Show_Str(30,50,200,16,"KEY_UP:退出测试  KEY0:发送数据",12,0);        
        sprintf((char*)p,"IP地址:%s 端口:%s",ipaddr,port);
        Show_Str(30,65,200,12,p,12,0);                        //显示IP地址和端口       
        Show_Str(30,80,200,12,"状态:",12,0);         //连接状态
        Show_Str(30,100,200,12,"发送数据:",12,0);         //连接状态
        Show_Str(30,115,200,12,"接收数据:",12,0);        //端口固定为8086
        POINT_COLOR=BLUE;
        USART3_RX_STA=0;
        sprintf((char*)p,"AT+CIPSTART=\"%s\",\"%s\",\"%s\"",modetbl[mode],ipaddr,port);
        if(sim900a_send_cmd(p,"OK",500))return;                //发起连接
        while(1)
        {
                key=KEY_Scan(0);
                if(key==WKUP_PRES)//退出测试                 
                {  
                        sim900a_send_cmd("AT+CIPCLOSE=1","CLOSE OK",500);        //关闭连接
                        sim900a_send_cmd("AT+CIPSHUT","SHUT OK",500);                //关闭移动场景
                        break;                                                                                                 
                }else if(key==KEY0_PRES&(hbeaterrcnt==0))                                //发送数据(心跳正常时发送)
                {
                        Show_Str(30+30,80,200,12,"数据发送中...",12,0);                 //提示数据发送中
                        if(sim900a_send_cmd("AT+CIPSEND",">",500)==0)                //发送数据
                        {
                                printf("CIPSEND DATA:%s\r\n",p1);                                 //发送数据打印到串口
                                u3_printf("%s\r\n",p1);
                                delay_ms(10);
                                if(sim900a_send_cmd((u8*)0X1A,"SEND OK",1000)==0)Show_Str(30+30,80,200,12,"数据发送成功!",12,0);//最长等待10s
                                else Show_Str(30+30,80,200,12,"数据发送失败!",12,0);
                                delay_ms(1000);
                        }else sim900a_send_cmd((u8*)0X1B,0,0);        //ESC,取消发送
                        oldsta=0XFF;                       
                }
                if((timex%20)==0)
                {
                        LED0=!LED0;
                        count++;       
                        if(connectsta==2||hbeaterrcnt>8)//连接中断了,或者连续8次心跳没有正确发送成功,则重新连接
                        {
                                sim900a_send_cmd("AT+CIPCLOSE=1","CLOSE OK",500);        //关闭连接
                                sim900a_send_cmd("AT+CIPSHUT","SHUT OK",500);                //关闭移动场景
                                sim900a_send_cmd(p,"OK",500);                                                //尝试重新连接
                                connectsta=0;       
                                hbeaterrcnt=0;
                        }
                        sprintf((char*)p1,"ATK-SIM900A %s测试 %d  ",modetbl[mode],count);
                        Show_Str(30+54,100,200,12,p1,12,0);
                }
                if(connectsta==0&&(timex%200)==0)//连接还没建立的时候,每2秒查询一次CIPSTATUS.
                {
                        sim900a_send_cmd("AT+CIPSTATUS","OK",500);        //查询连接状态
                        if(strstr((const char*)USART3_RX_BUF,"CLOSED"))connectsta=2;
                        if(strstr((const char*)USART3_RX_BUF,"CONNECT OK"))connectsta=1;
                }
                if(connectsta==1&&timex>=600)//连接正常的时候,每6秒发送一次心跳
                {
                        timex=0;
                        if(sim900a_send_cmd("AT+CIPSEND",">",200)==0)//发送数据
                        {
                                sim900a_send_cmd((u8*)0X00,0,0);        //发送数据:0X00  
                                delay_ms(20);                                                //必须加延时
                                sim900a_send_cmd((u8*)0X1A,0,0);        //CTRL+Z,结束数据发送,启动一次传输       
                        }else sim900a_send_cmd((u8*)0X1B,0,0);        //ESC,取消发送                
                               
                        hbeaterrcnt++;
                        printf("hbeaterrcnt:%d\r\n",hbeaterrcnt);//方便调试代码
                }
                delay_ms(10);
                if(USART3_RX_STA&0X8000)                //接收到一次数据了
                {
                        USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;        //添加结束符
                        printf("%s",USART3_RX_BUF);                                //发送到串口  
                        if(hbeaterrcnt)                                                        //需要检测心跳应答
                        {
                                if(strstr((const char*)USART3_RX_BUF,"SEND OK"))hbeaterrcnt=0;//心跳正常
                        }                               
                        p2=(u8*)strstr((const char*)USART3_RX_BUF,"+IPD");
                        if(p2)//接收到TCP/UDP数据
                        {
                                p3=(u8*)strstr((const char*)p2,",");
                                p2=(u8*)strstr((const char*)p2,":");
                                p2[0]=0;//加入结束符
                                sprintf((char*)p1,"收到%s字节,内容如下",p3+1);//接收到的字节数
                                LCD_Fill(30+54,115,239,130,WHITE);
                                POINT_COLOR=BRED;
                                Show_Str(30+54,115,156,12,p1,12,0); //显示接收到的数据长度
                                POINT_COLOR=BLUE;
                                LCD_Fill(30,130,210,319,WHITE);
                                Show_Str(30,130,180,190,p2+1,12,0); //显示接收到的数据
                        }
                        USART3_RX_STA=0;
                }
                if(oldsta!=connectsta)
                {
                        oldsta=connectsta;
                        LCD_Fill(30+30,80,239,80+12,WHITE);
                        Show_Str(30+30,80,200,12,(u8*)cnttbl[connectsta],12,0); //更新状态
                }
                timex++;
        }
        myfree(SRAMIN,p);
        myfree(SRAMIN,p1);
}
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-20
在线时间
12 小时
 楼主| 发表于 2018-3-5 09:36:08 | 显示全部楼层
15991069404 发表于 2018-3-5 08:59
我记得原子出过一个简易代码,就是SIM900A模块,我有用过,然后再在那个简易代码里面加东西,那个你只要把A ...

你有简易代码吗?我没找到那个简易代码。
回复

使用道具 举报

5

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2017-2-19
在线时间
53 小时
发表于 2018-3-5 19:38:19 | 显示全部楼层
zy11141617 发表于 2018-3-5 09:36
你有简易代码吗?我没找到那个简易代码。

是的,你可以找找,因为之前有用过,那个就是打电话和发英文短信的,教程给的那个复杂,但是只要看明白了,其实都一样
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-3-24
在线时间
13 小时
发表于 2019-3-24 22:14:46 | 显示全部楼层
p1好像还没有赋值,就和p一样,可能需要把内容通过格式化字符串的形式赋值,我也在搞,迷茫
回复

使用道具 举报

10

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2072
金钱
2072
注册时间
2016-8-15
在线时间
413 小时
发表于 2019-8-9 15:26:32 | 显示全部楼层
学习无止境啦 发表于 2019-3-24 22:14
p1好像还没有赋值,就和p一样,可能需要把内容通过格式化字符串的形式赋值,我也在搞,迷茫

2G模块和MCU通讯的AT流程,我这边有实际的项目源码,有兴趣可以加我Q;842936992
我的简书:https://www.jianshu.com/u/3e9efbf4a8c2
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-26 00:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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