簡體   English   中英

我想通過Arduino讀取ML-NTC2溫度傳感器值。 但我得到錯誤:從'char*'到'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 model 名稱是 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 中的關鍵更改為

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

手動執行類型轉換

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM