• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
ardunio-stm32采集风速传感器

 

 

 

 

 

 

 

 

 

 

 

 波特率都是4800 设备地址 默认01 广播FF

 

#define mySerial Serial2
// 查询一次
byte  Msg_getdata[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};
char RecData[9]={0};

// 风速 m/s
float fengsu[1]={0.0};
// 风速等级
int dnegji[1]={0};

            
//==============校验==============
uint16_t modbus_crc16( char *data, uint8_t length) {
  uint16_t crc = 0xFFFF;  
  for (uint8_t i = 0; i < length; i++) {
    crc ^= data[i];
    for (uint8_t j = 8; j > 0; j--) 
    {
      if (crc & 0x0001) 
      {
        crc = (crc >> 1) ^ 0xA001;
      } else 
      {
        crc >>= 1;
      }
    }
  }
  return crc;
}

// CRC16 校验
//  char senddata[6] = {0x30,0x31,0x00,0x00,0x00,0x02};
//  数据   数据长度(不包含校验码本身)
//  uint16_t crc = modbus_crc16(senddata, sizeof(senddata));
//
//  //CRC16: 0xB, 0xC4
//  uint16_t crc_H= (crc & 0xFF00) >> 8;
//  uint16_t crc_L= (crc & 0x00FF);
//  
//  Serial.print("CRC16: 0x");
//  Serial.print(crc_H, HEX);
//  Serial.print(", 0x");
//  Serial.println(crc_L, HEX);
/*
0~9  48~57 30~39H
A~Z 65~90 41~5AH
a~z 97~122  61~7AH
空格  32  20H
*/



void ReadSpeed(float *fengsu, int *dnegji){
  
   mySerial.write(Msg_getdata,sizeof(Msg_getdata)) ;
     
   while(1){
    
      if(mySerial.available()>0)//判断串口是否有数据可读
      {
        delay(50);
        for(int i=0;i<9;i++)
        {
           RecData[i]=mySerial.read();
           //Serial.print(i);  Serial.print(" - ");Serial.println(RecData[i]);
        }
       

          // 地址 功能码 数据长度 风速寄存器0高 风速寄存器0低 风级寄存器1高 风级寄存器1低 CRC16低校验码 CRC16高校验码 
          // 01 03 00 00 24 00 03 FA 39 
          uint16_t crc = modbus_crc16(RecData, sizeof(RecData)-2);// 最后两位是校验码
        
          //CRC16: 0xB, 0xC4
          uint16_t crc_H= (crc & 0xFF00) >> 8;
          uint16_t crc_L= (crc & 0x00FF);

          uint16_t crc_L_rec=RecData[7];
          uint16_t crc_H_rec=RecData[8];
          
          if(crc_L_rec=crc_L && crc_H_rec==crc_H)
          {
           
             fengsu[0]=(RecData[4])/10.0;
             dnegji[0] =(RecData[6]);
  
            //String showms=" 风速: " + String(fengsu)+"m/s 等级:"+String(dnegji);
            
            //Serial.println(showms);
            break;
          }
          else{

            fengsu[0]=0.1;
            dnegji[0]=0;
            
            Serial.println("校验失败......");            
            Serial.print("接收的CRC16: 0x");
            Serial.print(crc_L, HEX);
            Serial.print(", 0x");
            Serial.print(crc_H, HEX);


            Serial.print("  计算的CRC16: ");
            Serial.print(crc_L_rec, HEX);
            Serial.print(", 0x");
            Serial.println(crc_H_rec, HEX);
            break;
            }
      }

    
      delay(20);

   }

  
  }


void setup()
{
  Serial.begin(9600);
  mySerial.begin(4800);
}
 
void loop()
{

   delay(3000);
   ReadSpeed(fengsu,dnegji);
   String showms=" 风速: " + String(fengsu[0])+"m/s 等级:"+String(dnegji[0]);
   Serial.println(showms);

}

  

 

posted on 2023-10-20 20:29  MKT-porter  阅读(258)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3