OpenEdv-开源电子网

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

用STM32F407采集风速、风向传感器的数据,但是读的数不正确,大家看看是怎么回事?谢谢

[复制链接]

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
发表于 2018-6-13 15:54:43 | 显示全部楼层 |阅读模式
10金钱
我的传感器是基于RS485——modbus协议的,在我的程序中,还没有对从机发送给主机的数据进行细致分析。         给传感器发送的数据是固定的。
        u8 Sendbuf0[8] = {0x02,0x03,0x00,0x00,0x00,0x01,0x84,0x39}; //主机准备要发送给风向从机的数据。
        u8 Sendbuf1[8] = {0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A}; //主机准备要发送给风速从机的数据。


void USART2_IRQHandler(void)  //MODBUS一个字节接收中断
{
         u8 res;          
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
               
        {                
               res =USART_ReceiveData(USART2);//;读取接收到的数据USART2->DR
                RS485_RX_BUF[RS485_RX_CNT]=res;                //记录接收到的值
                RS485_RX_CNT++;        //接收一个字节,加一次。

        }
}
        while(1)
        {
              if(timeout == 1)//定时器中断标志,3秒钟中断一次
               {
                        RS485_Send_Data(Sendbuf0,8);//把数据发送给风向从机,然后风向传感器会返回7个数,例如[02,03,02,00,26,7D,9E],
                                                                      在接收缓冲区设置 RS485_RX_CNT计算所接收到数据的个数。
               
                        if(RS485_RX_CNT == 7)//因为数据一共为7个,判断是否接收完毕。但是,有疑问的是,我在单步运行的时候,却进不去,不知道是怎么回事。
                                                                                是因为我在接收中断函数中设置的RS485_RX_CNT方式不对吗??????
                        {
                               
                                a=RS485_RX_BUF[3];
                                a<<=8;
                                a|=RS485_RX_BUF[4];//我所需要的是第4、5个数值,赋给a。

                                sprintf((char*)FXbuf,"Feng xiang:%2d %s",a,"du");//如何把单位“度”显示到显示屏上
                                LCD_ShowString(30,120,210,16,16,FXbuf);
                                RS485_RX_CNT=0;//把计数给清零
                        }
                        delay_ms(1500);//延时的目的是因为,说明书要求,两次通信间隔至少1000ms以上
                       
                        RS485_Send_Data(Sendbuf1,8);//然后,在给风速传感器发送数据,同理也会返回7个数据。
                       
                        if(RS485_RX_CNT==7)//判断是否接收完毕
                        {
                               
                                a=RS485_RX_BUF[3];
                                a<<=8;
                                a|=RS485_RX_BUF[4];
                               
                                sprintf((char*)FSbuf,"Feng su:%2d %s",a,"m/s");
                                LCD_ShowString(30,140,210,16,16,FSbuf);
                                RS485_RX_CNT=0;
                               
                        }
                               
                        timeout=0;//清除中断标志,以便下次中断开启。
        }


我这里重点的疑问是,在我设置 if(RS485_RX_CNT==7)//判断是否接收完毕,为什么会进不去呢;
麻烦大家看看我哪里的思路有问题呢?谢谢了。


最佳答案

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

是不是要在中断里清除中断标志位
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

141

帖子

0

精华

高级会员

Rank: 4

积分
689
金钱
689
注册时间
2014-3-4
在线时间
96 小时
发表于 2018-6-13 15:54:44 | 显示全部楼层
是不是要在中断里清除中断标志位
回复

使用道具 举报

0

主题

113

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3317
金钱
3317
注册时间
2017-12-14
在线时间
405 小时
发表于 2018-6-13 16:11:37 | 显示全部楼层
你发完后,要等待下,看你这程序发完如果没接收完都不知道运行到哪了
回复

使用道具 举报

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
 楼主| 发表于 2018-6-13 17:13:59 | 显示全部楼层
feichangkunge 发表于 2018-6-13 16:11
你发完后,要等待下,看你这程序发完如果没接收完都不知道运行到哪了

嗯嗯,确实是一个问题,我加上了延时20ms,还是  if(RS485_RX_CNT == 7)进不去,它每次仅仅就增加一次,RS485_RX_CNT=1,按理说应该增加7次,然后进去循环,是不是我的中断里面写错了?但是自己没有看出来问题。您看中断有什么问题吗?麻烦
回复

使用道具 举报

0

主题

113

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3317
金钱
3317
注册时间
2017-12-14
在线时间
405 小时
发表于 2018-6-14 10:43:57 | 显示全部楼层
bufangqi 发表于 2018-6-13 17:13
嗯嗯,确实是一个问题,我加上了延时20ms,还是  if(RS485_RX_CNT == 7)进不去,它每次仅仅就增加一次,R ...

你延时时间弄长点,不要用仿真,直接跑程序,在if(RS485_RX_CNT==7)上面把RS485_RX_CNT打印出来,看看结果怎么样
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2018-7-9
在线时间
10 小时
发表于 2018-7-9 19:42:19 | 显示全部楼层
你好,我在做一个风速传感器的课设,能指导一下怎么读风速吗?
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2018-7-9
在线时间
10 小时
发表于 2018-7-9 19:42:57 | 显示全部楼层
Aslan 发表于 2018-7-9 19:42
你好,我在做一个风速传感器的课设,能指导一下怎么读风速吗?

我的QQ是844142580,希望能得到你的帮助,谢谢
回复

使用道具 举报

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
 楼主| 发表于 2018-7-10 16:10:22 | 显示全部楼层
luckywwq 发表于 2018-7-9 20:55
是不是要在中断里清除中断标志位

谢谢你。问题已经解决了。
回复

使用道具 举报

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2018-4-22
在线时间
67 小时
发表于 2018-7-25 18:43:23 | 显示全部楼层
bufangqi 发表于 2018-7-10 16:10
谢谢你。问题已经解决了。

用的什么传感器啊
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-11-28
在线时间
18 小时
发表于 2019-3-6 15:45:29 | 显示全部楼层
jjdkq 发表于 2018-7-25 18:43
用的什么传感器啊

请问用什么传感器
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-5-31
在线时间
1 小时
发表于 2019-5-31 11:30:59 | 显示全部楼层
你好,可以借鉴下你的代码吗,我最近也在做这个东西,我的邮箱是714613098@qq.com,万分感谢!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2022-4-1
在线时间
0 小时
发表于 2022-4-1 19:31:40 | 显示全部楼层
我把delay_ms(1500)放到了发送数据和接收数据中间,就完整拿到数据了!!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 00:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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