[英]error: invalid conversion from 'void*' to 'const uint8_t* {aka const unsigned char*}' [-fpermissive]
[英]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.