I want to read the ML-NTC2 temperature sensor value through Arduino. But I get error: invalid conversion from'char*' to'const uint8_t*'

I want to read the ML-NTC2 temperature sensor value through Arduino. But I get error: invalid conversion from'char*' to'const uint8_t*'

arduino型号名称为wemos d1 mini,板长安装了esp-8266。 ML-NTC2温度传感器采用Modbus 485通讯RTU方式。通讯模块为Esp-8266。 http://comfilewiki.co.kr/ko/doku.php?id=ml-ntc2:index

//Source file.ino//

#include <ML_NTC2.h>    // 
Includes a library for using the ML_NTC2 module.


void setup() {
  NTC2_begin(&Serial3);  // 
                            Select the serial port to communicate with the ML_NTC2 module.
   Serial.begin(57600);
}

void loop() {

  // ML_NTC2 module #1 value is read.
  float data_1 = NTC_readTemp(1,0);
  float data_2 = NTC_readTemp(1,1);
  
  delay(20);  

  // ML_NTC2 module #2 value is read.
  float data_3 = NTC_readTemp(2,0);
  float data_4 = NTC_readTemp(2,1);


  
  char outputData[20];
  Serial.printf(outputData,"%7s %7s",String(data_1).c_str(),String(data_2).c_str());

  Serial.printf(outputData,"%7s %7s",String(data_3).c_str(),String(data_4).c_str());
 
  delay(500); .
}


执行结果出现如下错误


C:\Users\easy\Documents\Arduino\libraries\ML_NTC2\ML_NTC2.cpp: In function 'float NTC_readTemp(char, char)':
C:\Users\easy\Documents\Arduino\libraries\ML_NTC2\ML_NTC2.cpp:17:39: error: invalid conversion from 'char*' to 'const uint8_t* {aka const unsigned char*}' [-fpermissive]
   short computeCrc = CRC::crc16(data,6);
                                       ^
In file included from C:\Users\easy\Documents\Arduino\libraries\ML_NTC2\ML_NTC2.cpp:2:0:
C:\Users\easy\Documents\Arduino\libraries\CRC/CRC.h:32:14: error:   initializing argument 1 of 'uint16_t CRC::crc16(const uint8_t*, size_t)' [-fpermissive]
     uint16_t crc16(const uint8_t* buff, size_t size)
              ^
C:\Users\easy\Documents\Arduino\libraries\ML_NTC2\ML_NTC2.cpp:23:35: error: invalid conversion from 'char*' to 'const uint8_t* {aka const unsigned char*}' [-fpermissive]
     computeCrc = CRC::crc16(data,5);
                                   ^
In file included from C:\Users\easy\Documents\Arduino\libraries\ML_NTC2\ML_NTC2.cpp:2:0:
C:\Users\easy\Documents\Arduino\libraries\CRC/CRC.h:32:14: error:   initializing argument 1 of 'uint16_t CRC::crc16(const uint8_t*, size_t)' [-fpermissive]
     uint16_t crc16(const uint8_t* buff, size_t size)
              ^
exit status 1
Board WeMos D1 R1 Comfile error.



使用的库代码如下

CRC.H
#pragma once
#ifndef CRC_ARDUINO_H
#define CRC_ARDUINO_H

namespace CRC
{
    uint8_t crc8(const uint8_t *buff, size_t size)
    {
        uint8_t* p = (uint8_t*)buff;
        uint8_t result = 0xFF;

        for (result = 0 ; size != 0 ; size--)
        {
            result ^= *p++;

            for (size_t i = 0 ; i < 8; i++)
            {
                if (result & 0x80)
                {
                    result <<= 1;
                    result ^= 0x85; // x8 + x7 + x2 + x0
                }
                else
                {
                    result <<= 1;
                }
            }
        }
        return result;
    }

    uint16_t crc16(const uint8_t* buff, size_t size)
    {
        uint8_t* data = (uint8_t*)buff;
        uint16_t result = 0xFFFF;

        for (size_t i = 0; i < size; ++i)
        {
            result ^= data[i];
            for (size_t j = 0; j < 8; ++j)
            {
                if (result & 0x01) result = (result >> 1) ^ 0xA001;
                else result >>= 1;
            }
        }
        return result;
    }

}

#endif // CRC_ARDUINO_H

ML_NTC2.CPP

#include "ML_NTC2.h"
#include <CRC.h>

#define MAX_ULONG 4294967295UL

static HardwareSerial *comm;

void NTC2_begin(HardwareSerial *serial)
{
    comm = serial;
    comm->begin(57600);
}

float NTC_readTemp(char address,char channel)
{
  char data[8] = {address,0x03,0x01,0xf4+channel,0x00,0x01,};
  short computeCrc = CRC::crc16(data,6);
  *(short*)&data[6] = computeCrc;
  comm->write(data,8);

  unsigned long old_time = millis();
  unsigned long cur_time;
  bool state_req = false;

  do
  {
    if(comm->available() < 7)
    {
      cur_time = millis();
    }
    else
    {
      state_req = true;
      break;
    }
  } while((MAX_ULONG-old_time+cur_time) % MAX_ULONG < 500);

  if(state_req == true)
  {
    comm->readBytes(data,7);
    computeCrc = CRC::crc16(data,5);
    if(computeCrc == *(short*)&data[5])
    {
      short result = ((short)data[3] << 8) + data[4];
      return result / 100.0f;
    }
  }
  while(comm->available()) comm->read();

  return -200.0f; // false.
}
ML_NTC.H

/*
 * ML_NTC2.h
 *
 *  Created on: 2019. 7. 3.
 *      Author: user
 */

#ifndef ML_NTC2_H_
#define ML_NTC2_H_

#ifndef Arduino_h
#include <Arduino.h>
#endif

void  NTC2_begin(HardwareSerial *serial);
float NTC_readTemp(char address, char channel);


#endif /* ML_NTC2_H_ */


调用函数的链是

float NTC_readTemp(char address,char channel)   
   {
      char data[8] = {address,0x03,0x01,0xf4+channel,0x00,0x01,};   // data is an array of char values
      short computeCrc = CRC::crc16(data,6);    // this array of char values is passed to the CRC check CRC::crc16 

->

uint16_t crc16(const uint8_t* buff, size_t size)
    {
        uint8_t* data = (uint8_t*)buff;   // but CRC::crc16 requires an const uint8_t pointer

...
    }

无法从 char* 转换为 const uint8_t*,因为 const

如果你写了 ML_NTC2.CPP 和 CRC.H,你必须修改它(const 定义很关键),否则这是库中的一个错误

尝试将ML_NTC2.CPP中的critical改成

short computeCrc = CRC::crc16((const uint8_t *)data,6);

手动执行类型转换