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

2019-07-20 01:33发布

我的传感器是基于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)//判断是否接收完毕,为什么会进不去呢;
麻烦大家看看我哪里的思路有问题呢?谢谢了。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
luckywwq
1楼-- · 2019-07-20 03:18
是不是要在中断里清除中断标志位
feichangkunge
2楼-- · 2019-07-20 05:14
 精彩回答 2  元偷偷看……
bufangqi
3楼-- · 2019-07-20 07:00
feichangkunge 发表于 2018-6-13 16:11
你发完后,要等待下,看你这程序发完如果没接收完都不知道运行到哪了

嗯嗯,确实是一个问题,我加上了延时20ms,还是  if(RS485_RX_CNT == 7)进不去,它每次仅仅就增加一次,RS485_RX_CNT=1,按理说应该增加7次,然后进去循环,是不是我的中断里面写错了?但是自己没有看出来问题。您看中断有什么问题吗?麻烦
feichangkunge
4楼-- · 2019-07-20 08:50
bufangqi 发表于 2018-6-13 17:13
嗯嗯,确实是一个问题,我加上了延时20ms,还是  if(RS485_RX_CNT == 7)进不去,它每次仅仅就增加一次,R ...

你延时时间弄长点,不要用仿真,直接跑程序,在if(RS485_RX_CNT==7)上面把RS485_RX_CNT打印出来,看看结果怎么样
Aslan
5楼-- · 2019-07-20 09:48
 精彩回答 2  元偷偷看……
Aslan
6楼-- · 2019-07-20 09:58
Aslan 发表于 2018-7-9 19:42
你好,我在做一个风速传感器的课设,能指导一下怎么读风速吗?

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

一周热门 更多>