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


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。