OpenEdv-开源电子网

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

原子哥写的SIM800C测试程序,自己写了一小段,从一开始就出错了,大家看看是怎么回事?谢谢

[复制链接]

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
发表于 2018-7-16 16:37:32 | 显示全部楼层 |阅读模式
10金钱
原子哥写的SIM800C测试程序,由于自己仅仅需要GPRS通信这一部分,所以自己仿写一段程序,但是程序从一开始就运行不过去。也没有找到问题出在了
哪里,看大家 能不能帮忙看一下。谢谢。
这是程序:程序直接在while()循环里出不来了,硬件连接上没有问题,跑原子哥的程序是没有问题的。
也没有涉及到多么复杂的联系,仅仅是个基础类的AT命令,但是程序就是跑不出去,大家帮忙看看是哪里出了问题,还是那些初始化的设置忽略了,
谢谢大家了。
int main(void)
{
        u8 *p1;
        u32 time;
        u8 connectsta=0;                        //0,正在连接;1,连接成功;2,连接关闭;
        u8 hbeaterrcnt=0;                        //心跳错误计数器,连续5次心跳信号无应答,则重新连接
        u8 sim_ready = 0;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);                               //初始化延时函数
        uart_init(115200);                                       //初始化串口波特率为115200
        LED_Init();                                                           //初始化LED
        LCD_Init();               
        W25QXX_Init();
        usart3_init(115200);
        LCD_ShowString(60,10,200,16,16,"ATK-SIM800C ceshi");
        USART3_RX_STA=0;
        while(sim800c_send_cmd("AT","OK",100))//检测是否应答AT指令
        {
                LCD_ShowString(60,30,200,16,16,"wei jian ce dao!!!");
                delay_ms(800);
                LCD_Fill(60,30,200,16,WHITE);
                LCD_ShowString(60,30,200,16,16,"chang shi lian jie...");
                delay_ms(400);  
        }

最佳答案

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

嗯嗯,找到问题所在了, while(--waittime) //等待倒计时 { delay_ms(20);//在判断数据是否接收完整之前,先给一段延时,保证数据能够完全接收完成。就是简简单单的一句延时没有加上。 if(USART3_RX_STA&0X8000) } 谢谢大家了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
 楼主| 发表于 2018-7-16 16:37:33 | 显示全部楼层
正点原子 发表于 2018-7-18 01:11
说明检查OK就出错了,跟踪进去函数,一步步看。最终看死哪里(不要认为是函数就是最终了,进入函数里面, ...

嗯嗯,找到问题所在了, while(--waittime)                //等待倒计时
                {
                        
                       delay_ms(20);//在判断数据是否接收完整之前,先给一段延时,保证数据能够完全接收完成。就是简简单单的一句延时没有加上。
                        if(USART3_RX_STA&0X8000)
                 }

谢谢大家了。
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12687
金钱
12687
注册时间
2012-11-26
在线时间
3710 小时
发表于 2018-7-16 16:41:52 | 显示全部楼层
说明没收到OK  或者你接收函数处理有问题
回复

使用道具 举报

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
 楼主| 发表于 2018-7-16 17:30:55 | 显示全部楼层
jermy_z 发表于 2018-7-16 16:41
说明没收到OK  或者你接收函数处理有问题

嗯嗯,谢谢你。可能是这里的原因,但是自己检查过了,也没有发现什么问题。程序是原子哥的程序,只是把蓝牙扫描模式的程序给删除了,其他的没有改变。不知是哪里的问题。
//向SIM800C发送命令
//cmd:发送的命令字符串(不需要添加回车了),当cmd<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串.
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)
//       1,发送失败
u8 sim800c_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
        u8 res=0;
        USART3_RX_STA=0;//发送数据之前,一定要将USART3_RX_STA清零。
        if((u32)cmd<=0XFF)
        {
                while((USART3->SR&0X40)==0);//等待上一次数据发送完成  TC 发送完成标志位,TC = 1;表示发送完成。
                USART3->DR=(u32)cmd;//数据寄存器DR
        }
        else
                u3_printf("%s\r\n",cmd);  //发送命令
       

        if(ack&&waittime)                        //需要等待应答
        {
                while(--waittime)                //等待倒计时
                {
                       
                       
                        if(USART3_RX_STA&0X8000)//接收到期待的应答结果,这里是按位与,仅仅判断USART3_RX_STA最高位是不是为1,等于1,说明接收完数据。
                        {                //sim800c_check_cmd(ack);返回值:0,没有得到期待的应答结果
                                if(sim800c_check_cmd(ack))break;//得到有效数据,若成立,break,直接跳出while循环
                                USART3_RX_STA=0;
                        }
                }
                if(waittime==0)res=1;
        }
        return res;//res=0;初始设置为0.返回值:0,发送成功(得到了期待的应答结果)
}
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12687
金钱
12687
注册时间
2012-11-26
在线时间
3710 小时
发表于 2018-7-16 20:43:00 | 显示全部楼层
自己debug吧,看看到底是什么情况
学无止境
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-7-17 01:22:40 | 显示全部楼层
直接用我们例程测试
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-9-24
在线时间
3 小时
发表于 2018-7-17 13:28:30 | 显示全部楼层
正点原子 发表于 2018-7-17 01:22
直接用我们例程测试

大神,小白请教一下,为什么sim800c_send_cmd(u8 *cmd,u8 *ack,u16 waittime)这个函数定义的cmd是8位指针,后面USART3->DR=(u32)cmd;有变成32位的变量了啊?
回复

使用道具 举报

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
 楼主| 发表于 2018-7-17 20:21:44 | 显示全部楼层
正点原子 发表于 2018-7-17 01:22
直接用我们例程测试

原子哥,用的是您的程序,只是有些程序用不到,就像 做些删减,没想到一开始就错了。目前也没找到原因。错误就是停在while循环里了,程序的其他地方都没有更改。
回复

使用道具 举报

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
 楼主| 发表于 2018-7-17 20:27:10 | 显示全部楼层
han52414133 发表于 2018-7-17 13:28
大神,小白请教一下,为什么sim800c_send_cmd(u8 *cmd,u8 *ack,u16 waittime)这个函数定义的cmd是8位指针 ...

我也不知道自己说的准确不准确。我认为应该写为sim800c_send_cmd(u32 *cmd.......),因为上面注释有写到,当cmd<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串.而0xFF正好是八位,发送数字。但是肯定还有比八位大的,发送字符串。所以我觉得应该改为u32,符合程序所表达的意思。这是我的见解。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-7-18 01:11:37 | 显示全部楼层
bufangqi 发表于 2018-7-17 20:21
原子哥,用的是您的程序,只是有些程序用不到,就像 做些删减,没想到一开始就错了。目前也没找到原因。 ...

说明检查OK就出错了,跟踪进去函数,一步步看。最终看死哪里(不要认为是函数就是最终了,进入函数里面,直到没有函数可进为止!!)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-9-24
在线时间
3 小时
发表于 2018-7-18 09:15:32 | 显示全部楼层
bufangqi 发表于 2018-7-17 20:27
我也不知道自己说的准确不准确。我认为应该写为sim800c_send_cmd(u32 *cmd.......),因为上面注释有写到 ...

谢谢啦,路飞
回复

使用道具 举报

9

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
931
金钱
931
注册时间
2017-3-23
在线时间
255 小时
发表于 2018-7-18 15:52:21 | 显示全部楼层
首先确保SIM模块时开机状态,然后可以直接拿串口调试助手进行调试,如果OK再用单片机调试。
回复

使用道具 举报

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
 楼主| 发表于 2018-7-19 09:24:05 | 显示全部楼层
未知1908 发表于 2018-7-18 15:52
首先确保SIM模块时开机状态,然后可以直接拿串口调试助手进行调试,如果OK再用单片机调试。

嗯嗯,谢谢你。
回复

使用道具 举报

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
 楼主| 发表于 2018-7-19 09:24:29 | 显示全部楼层

不客气,互相帮助嘛
回复

使用道具 举报

6

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
251
金钱
251
注册时间
2018-7-7
在线时间
13 小时
发表于 2018-7-19 09:58:15 | 显示全部楼层
分享解决GPRS模块SIM800c连接不到服务器问题方法
http://www.openedv.com/forum.php ... d=274554&extra=
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 23:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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