C++ 我想通过Arduino读取ML-NTC2温度传感器值。但我得到一个错误:从';字符*';至';const uint8_t*';

C++ 我想通过Arduino读取ML-NTC2温度传感器值。但我得到一个错误:从';字符*';至';const uint8_t*';,c++,c,arduino,C++,C,Arduino,arduino型号名称为wemos d1 mini,board manager安装了esp-8266。ML-NTC2温度传感器采用Modbus 485通信RTU方式。通信模块为Esp-8266。 所用库的代码如下所示 CRC.H #pragma once #ifndef CRC_ARDUINO_H #define CRC_ARDUINO_H namespace CRC { uint8_t crc8(const uint8_t *buff, size_t size) {

arduino型号名称为wemos d1 mini,board manager安装了esp-8266。ML-NTC2温度传感器采用Modbus 485通信RTU方式。通信模块为Esp-8266。

所用库的代码如下所示

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

CRC.H
#布拉格语一次
#ifndef CRC_ARDUINO_H
#定义CRC_ARDUINO_H
命名空间CRC
{
uint8\u t crc8(常数uint8\u t*增益,大小)
{
uint8_t*p=(uint8_t*)buff;
uint8_t结果=0xFF;
对于(结果=0;大小!=0;大小--)
{
结果^=*p++;
对于(大小i=0;i<8;i++)
{
if(结果&0x80)
{
结果=1;
}
}
返回结果;
}
}
#endif//CRC_ARDUINO_H
ML\u NTC2.CPP
#包括“ML_NTC2.h”
#包括
#定义最大长度4294967295UL
静态硬件序列*通信;
无效NTC2_开始(硬件序列*序列)
{
通信=串行;
通信->开始(57600);
}
浮点NTC_readTemp(字符地址、字符通道)
{
字符数据[8]={地址,0x03,0x01,0xf4+通道,0x00,0x01,};
短计算CRC=CRC::crc16(数据,6);
*(短*)和数据[6]=计算CRC;
通信->写入(数据,8);
无符号长时间=毫秒();
无符号长电流时间;
bool state_req=false;
做
{
如果(通信->可用()<7)
{
cur_time=millis();
}
其他的
{
state_req=true;
打破
}
}而((最大持续时间+当前持续时间)%最大持续时间<500);
if(state_req==true)
{
comm->readBytes(数据,7);
computeCrc=CRC::crc16(数据,5);
if(computeCrc==*(短*)&数据[5])
{
短结果=((短)数据[3]可用())通信->读取();
返回-200.0f;//false。
}
ML\u NTC.H
/*
*ML_NTC2.h
*
*创建日期:2019年7月3日。
*作者:用户
*/
#ifndef ML\u NTC2\u H_
#定义ML\u NTC2\u H_
#伊芬德夫·阿杜伊诺
#包括
#恩迪夫
无效NTC2_开始(硬件序列*序列);
浮点NTC_readTemp(字符地址、字符通道);
#endif/*ML\u NTC2\u H\u*/

调用函数的链是

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 
->

由于
常量

如果您编写了ML_NTC2.CPP和CRC.H,则必须对其进行调整(const的定义非常重要),否则这将是库中的一个错误

尝试将ML_NTC2.CPP中的临界值更改为

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

要手动执行类型转换,调用函数的链是

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 
->

由于
常量

如果您编写了ML_NTC2.CPP和CRC.H,则必须对其进行调整(const的定义非常重要),否则这将是库中的一个错误

尝试将ML_NTC2.CPP中的临界值更改为

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

要手动执行类型转换

您可以制作
字符数据[8]=
uint8\u t数据[8]=
您可以制作
字符数据[8]=
uint8\u t数据[8]=从非常量到常量的转换应该没有问题。问题更可能是由从
char*
uint8\u t*
的转换引起的。如果我将数组类型更改为
uint8\u t data[]
在g++中运行时,错误消失了。它工作正常!!非常感谢。这是一个非常有用的答案!!@baeyeongbin,答案部分错误。请参阅GerhardhConversion的评论,从非常量到常量应该不是问题。问题更可能是由从
char*
uint8\u t*
的转换引起的。如果我将数组类型更改为
uint8\u t data[]
在g++中运行时,错误消失。它工作正常!!非常感谢。这是一个非常有用的答案!!@baeyeongbin,答案部分错误。请参阅Gerhardh的评论
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

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