OpenEdv-开源电子网

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

SIM900A发送命令函数疑惑,是否有BUG?

[复制链接]

38

主题

196

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1177
金钱
1177
注册时间
2015-11-9
在线时间
249 小时
发表于 2016-2-22 12:34:23 | 显示全部楼层 |阅读模式
1金钱
u8 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
        u8 res=0;
       
        USART2_RX_STA=0;
        if( (u32)cmd <= 0XFF)
        {
                while(DMA1_Channel7->CNDTR!=0);        //等待通道7传输完成   
                USART2->DR=(u32)cmd;
        }else
        u2_printf("%s\r\n",cmd);//发送命令
        if(ack&&waittime)                //需要等待应答
        {
                while(--waittime)        //等待倒计时
                {
                        delay_ms(10);
                        if(USART2_RX_STA&0X8000)//接收到期待的应答结果
                        {
                                if(sim900a_check_cmd(ack))break;//得到有效数据
                                USART2_RX_STA=0;
                        }
                }
                if(waittime==0)res=1;
        }
        return res;
}
这个函数中if( (u32)cmd <= 0XFF)判断语句, (u32)cmd得到的应该是要发送的字符或是字符串的内存地址吧。如果要发送的字符恰好是放在小于0xff的内存空间中(比如要发送"a"这个字符,而a恰好被放在了0x11这个内存空间中),那岂不是就发送0x11了,而达不到发送‘a’的目的了?
原子求教?????????????

最佳答案

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

命令分,HEX格式命令,和字符串式命令,那句就是判断,到底是HEX命令还是ASCII码式命令,要是想不通,就自己好好琢磨吧,只能告诉你,这句话没有BUG
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2016-2-22 12:34:24 | 显示全部楼层
shibinjie 发表于 2016-2-22 16:45
是判断命令。(u32)cmd 得到的难道不是地址吗?比如传的是“AT”,(u32)cmd 应该是A这个字符存放的内存地 ...

命令分,HEX格式命令,和字符串式命令,那句就是判断,到底是HEX命令还是ASCII码式命令,要是想不通,就自己好好琢磨吧,只能告诉你,这句话没有BUG
学无止境
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2016-2-22 14:51:23 | 显示全部楼层
那个是判断命令首个意义,而不是什么地址!是ASCII还是什么,仔细看文档!!
回复

使用道具 举报

38

主题

196

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1177
金钱
1177
注册时间
2015-11-9
在线时间
249 小时
 楼主| 发表于 2016-2-22 16:45:21 | 显示全部楼层
jermy_z 发表于 2016-2-22 14:51
那个是判断命令首个意义,而不是什么地址!是ASCII还是什么,仔细看文档!!

是判断命令。(u32)cmd 得到的难道不是地址吗?比如传的是“AT”,(u32)cmd 应该是A这个字符存放的内存地址吧 ,我仿真出来是0x080111F0,当然这个地址是不固定的,是可能会变的。
你的理解呢?
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2016-2-22 22:51:21 | 显示全部楼层
如果你输入的是字符串常量的话,那么他的u8*指针转u32就是地址的具体数值,常量是存放在0x80000000地址之后的,那个u32的数值就是0x8000xxxx,这个数值明显要比0xff大,所以这样比较可以比较字符串常量和数值。。。。。。
回复

使用道具 举报

38

主题

196

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1177
金钱
1177
注册时间
2015-11-9
在线时间
249 小时
 楼主| 发表于 2016-2-23 08:43:49 | 显示全部楼层
FantaSy_ 发表于 2016-2-22 22:51
如果你输入的是字符串常量的话,那么他的u8*指针转u32就是地址的具体数值,常量是存放在0x80000000地址之后 ...

嗯,明白了!谢谢!看了下内存映射。常量是放在0X0800xxxx地址之后,不是0X8000XXXX吧
回复

使用道具 举报

38

主题

196

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1177
金钱
1177
注册时间
2015-11-9
在线时间
249 小时
 楼主| 发表于 2016-2-23 08:48:55 | 显示全部楼层
这个个人感觉不是最佳答案,虽然说的没错,但5楼才是把最根本原理说明白了
回复

使用道具 举报

0

主题

63

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3867
金钱
3867
注册时间
2015-8-26
在线时间
285 小时
发表于 2016-2-23 09:00:52 | 显示全部楼层
围观一下
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2016-2-23 12:30:58 | 显示全部楼层
shibinjie 发表于 2016-2-23 08:43
嗯,明白了!谢谢!看了下内存映射。常量是放在0X0800xxxx地址之后,不是0X8000XXXX吧

具体地址我忘记多少了,只是举个地址的例子。。。哈哈!!!!
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2016-2-23 12:32:02 | 显示全部楼层
shibinjie 发表于 2016-2-23 08:48
这个个人感觉不是最佳答案,虽然说的没错,但5楼才是把最根本原理说明白了

明白了就好!!!
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2016-2-25 21:52:07 | 显示全部楼层
shibinjie 发表于 2016-2-23 08:48
这个个人感觉不是最佳答案,虽然说的没错,但5楼才是把最根本原理说明白了

那说明你还是没理解这句话是什么意思
学无止境
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 22:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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