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);
手动执行类型转换
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);
手动执行类型转换