OpenEdv-开源电子网

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

串口接收AJ-SR04M数据用数组打印出来,搞不懂哪里有错

[复制链接]

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-3-13
在线时间
8 小时
发表于 2019-3-23 11:37:58 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 Diviner 于 2019-3-23 11:40 编辑

[mw_shl_code=applescript,true]// 串口2中断服务函数

void DEBUG_USART2_IRQHandler(void)
{
        char Temp2;
        flag=0;
        if(USART_GetITStatus(DEBUG_USART2,USART_IT_RXNE)!=RESET)
        {        

                Temp2 = USART_ReceiveData(DEBUG_USART2);
                //USART_SendData(DEBUG_USART1,Temp2);  
                D[l++]=Temp2;

        }         

}[/mw_shl_code]

[mw_shl_code=applescript,true]int main(void)
{        
        char *str="01";
        USART1_Config();
        USART2_Config();
        LED_GPIO_Config();      
        Usart_SendStr(DEBUG_USART2,(uint8_t*)str);
        printf( "串口printf函数测试\n" );

  while (1)
{
  if(Temp2=='\0')
        {
                break;
        }
}
        LED2_ON;
printf("距离=");
  for(l=0;l<20;l++)
                {
                        printf("%c",D[l]);
                }

        while (1)
        {
        
        }
}[/mw_shl_code]


串口.jpg

最佳答案

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

你的main函数写的有问题,一上电,执行初始化,打印 串口printf函数测试,进入第一个while(1),这时全局变量Temp2是你的初始化的0,也就是'\0',if条件成立跳出第一个while(1);执行打印 距离=,进入for循环,此时的数组D里面的数据全是0,也就是'\0',全部打印,进入到第二个while(1).此时你的AJ-SR04M即使输出数据你也打印不出来了 执行结果跟你的程序设计完全一致。 至于你说的得不到你想要的结果,那是你的逻辑设计有问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2019-3-23 11:37:59 | 显示全部楼层
你的main函数写的有问题,一上电,执行初始化,打印 串口printf函数测试,进入第一个while(1),这时全局变量Temp2是你的初始化的0,也就是'\0',if条件成立跳出第一个while(1);执行打印 距离=,进入for循环,此时的数组D里面的数据全是0,也就是'\0',全部打印,进入到第二个while(1).此时你的AJ-SR04M即使输出数据你也打印不出来了

执行结果跟你的程序设计完全一致。
至于你说的得不到你想要的结果,那是你的逻辑设计有问题。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2018-12-18
在线时间
14 小时
发表于 2019-3-23 14:32:20 | 显示全部楼层
你这个Temp2在中断里定义,在main里面使用?
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2018-12-18
在线时间
14 小时
发表于 2019-3-23 14:33:30 | 显示全部楼层
还是你定义了两个重名的局部变量和全局变量
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-3-13
在线时间
8 小时
 楼主| 发表于 2019-3-23 15:00:54 | 显示全部楼层
oslll 发表于 2019-3-23 14:33
还是你定义了两个重名的局部变量和全局变量

这样子
QQ截图20190323145947.jpg
QQ截图20190323150012.jpg
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-3-13
在线时间
8 小时
 楼主| 发表于 2019-3-23 15:03:24 | 显示全部楼层
oslll 发表于 2019-3-23 14:32
你这个Temp2在中断里定义,在main里面使用?

我也试过
if(D[l++]=='\0')
这样子,也是出现那种情况
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-23 15:09:38 | 显示全部楼层
本帖最后由 edmund1234 于 2019-3-23 15:13 编辑

l 在main ++, 在中断里也++, 这是搞什么鬼了?
在中断里定义了同名的Temp2, 所以中断的Temp2与全局的Temp2是两个变量, 所以你在main判断Temp2是没意思的, 它永远不可能被中断赋值的

回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-3-13
在线时间
8 小时
 楼主| 发表于 2019-3-23 15:25:57 | 显示全部楼层
edmund1234 发表于 2019-3-23 15:09
l 在main ++, 在中断里也++, 这是搞什么鬼了?
在中断里定义了同名的Temp2, 所以中断的Temp2与全局的Te ...

对吼,我把他们混为一谈了,尴尬
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-3-13
在线时间
8 小时
 楼主| 发表于 2019-3-23 15:58:38 | 显示全部楼层
szczyb1314 发表于 2019-3-23 15:20
你的main函数写的有问题,一上电,执行初始化,打印 串口printf函数测试,进入第一个while(1),这时全局变 ...

问题解决了,谢谢
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-3-13
在线时间
8 小时
 楼主| 发表于 2019-3-23 15:58:59 | 显示全部楼层
edmund1234 发表于 2019-3-23 15:09
l 在main ++, 在中断里也++, 这是搞什么鬼了?
在中断里定义了同名的Temp2, 所以中断的Temp2与全局的Te ...

问题解决了,谢谢
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-10-21
在线时间
3 小时
发表于 2019-10-22 11:20:25 | 显示全部楼层
楼楼最后是怎么解决的呀,新手想看下了解一下谢谢啦
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-2 20:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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