首页 > 其他分享 >ardunio-stm32采集风速传感器

ardunio-stm32采集风速传感器

时间:2023-10-20 20:33:09浏览次数:34  
标签:crc HEX stm32 ardunio uint16 风速 print rec Serial

 

 

 

 

 

 

 

 

 

 

 

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

 

#define mySerial Serial2
byte  Msg_getdata[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};
char RecData[9]={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 setup()
{
  Serial.begin(4800);
  mySerial.begin(4800);



  
}
 
void loop()
{


   delay(3000);

   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)
          {
            
            float fengsu=(RecData[4])/10.0;
            int dnegji =(RecData[6]);
  
            String showms=" 风速: " + String(fengsu)+"m/s 等级:"+String(dnegji);
            
            Serial.println(showms);
            break;
          }
          else{
            
            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);

   }

  

}

  

标签:crc,HEX,stm32,ardunio,uint16,风速,print,rec,Serial
From: https://www.cnblogs.com/gooutlook/p/17777957.html

相关文章

  • STM32 EEPROM_Emulation 保存数据使用注意事项
    1目的:stm32官方提供flash模拟eeprom的代码例子,为了能给产品添加数据保存功能,可以改造该例子迅速完成数据保存的功能。示例代码路径:C:\Users\rd-yhzhang\STM32Cube\Repository\STM32Cube_FW_F1_V1.8.5\Projects\STM32F103RB-Nucleo\Applications\EEPROM\EEPROM_Emulation。2......
  • STM32单片机实现Bootloader跳转的关键步骤(转载)
    STM32单片机实现Bootloader跳转的关键步骤-知乎(zhihu.com)STM32单片机实现Bootloader跳转的关键步骤(qq.com)现在越来越多的嵌入式设备支持远程自动升级,不需要再借助下载器。这样对于设备的维护非常方便。当然若使设备支持远程升级,需要编写支持升级的程序代码,可以称之为B......
  • STM32 ADC基础知识讲解
    (文章目录)前言在正式的学习如何编写ADC代码时我们先来学习一下ADC的基础知识部分,只有掌握好了这些基础知识才能顺利的进行后面的代码编写。一、ADC的基本介绍ADC指的是模数转换器(Analog-to-DigitalConverter),它是一种用于将模拟信号转换为数字信号的电子设备或电路。模拟信......
  • STM32——GPIO输出
    一、结构二、8种模式三、对推挽输出、开漏输出的理解1、推挽输出:推:将电流推出去    挽:将电流挽回来 上图的前两种情况组合,就是推挽输出模式。情况1时即“推”,情况2时即“挽”。2、开漏输出:漏:漏极啥也没接。情况2与3组合构成开漏模式。(常配一个外接上拉电阻)......
  • 关于STM32 HAL库版本IAP升级跳转一直进入HAL_Delay()函数;只需要在升级 程序中加入如下
    __set_FAULTMASK(1);/*setvectortable/SCB->VTOR=FLASH_BASE|0x1F800;///USERCODEEND1*//*MCUConfiguration--------------------------------------------------------//Resetofallperipherals,InitializestheFlashinterfaceandtheSystick......
  • FPGA, arduino, STM32, RaspBerry 树莓派 简介
    https://www.cnblogs.com/zhenghb31/p/15046496.html 市面上控制器这么多,似乎每一个都很厉害…为什么有的控制器编写起来那么难,功能很少,有的简单易学,功能强大呢?各种控制器又有什么区别呢?经过我的思考,我个人把控制器分为三类!第一类:基于逻辑电路的控制器(FPGA)FPGA(FieldPr......
  • Clion+STM32配置环境
    Clion+STM32配置环境下载安装下载Clion,具体步骤省略https://www.jetbrains.com/clion/download/Clion官方的教程网址如下https://www.jetbrains.com/help/clion/embedded-development.html需要下载的东西有openocd和GNUARM工具链openocd:https://gnutoolchains.com/arm-eab......
  • 【STM32基础 CubeMX】PWM输出
    @TOC前言STM32微控制器是一系列功能强大的微控制器,广泛应用于嵌入式系统和电子设备中。其中一个常见的应用是生成PWM信号,用于控制各种设备,如电机、LED灯、声音发生器等。了解如何配置和使用PWM输出对于嵌入式系统开发非常重要。CubeMX是STMicroelectronics提供的一种工具,用于帮助开......
  • 【STM32基础 CubeMX】定时器的使用
    @TOC前言在嵌入式系统开发中,精确地控制时间和时序是至关重要的。STM32微控制器提供了强大的定时器功能,使开发者能够轻松地实现各种时间相关任务。本文将介绍STM32定时器的基础知识和使用方法,帮助初学者了解如何在STM32上利用定时器实现定时任务、生成脉冲信号、进行计时等操作。无......
  • STM32之CAN通信
    Can通信学习资料:正点原子CAN总线的学习瓶邪!-CAN详解前言LAN(即局域网)是最常见且应用最为广泛的一种网络,它是指在1~5公里范围内两台以上的计算机设备(如服务器、工作站)通过线缆(如同轴线缆、双绞线、光缆等)连接起来实现的资源共享的计算机网络,如家庭、办公室、学校或者有计......