OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 171|回复: 3

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

[复制链接]

  离线 

13

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-10-30
在线时间
22 小时
发表于 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)//判断是否接收完毕,为什么会进不去呢;
麻烦大家看看我哪里的思路有问题呢?谢谢了。


回复

使用道具 举报

  离线 

0

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

13

主题

39

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

0

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2017-12-14
在线时间
70 小时
发表于 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打印出来,看看结果怎么样
回复

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-6-25 23:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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