How to call C functions from Arduino sketch?
You can extern "C" #include like the following:
extern "C"{
#include "crc16.h"
};
void setup(){
}
void loop(){
CalculateCRC16("<09M", 4);
}
And the crc16.h file could be (some minor fixes, the #pragma once, a cast):
#pragma once
#include <stdio.h>
#include <stdint.h>
uint16_t crctable[2] ={ 0x0000, 0x1189};
uint16_t CalculateCRC16( // Call example CalculateCRC16("<09M", 4);
const void *c_ptr, // Pointer to byte array to perform CRC on
size_t len) // Number of bytes to CRC
{
uint16_t crc = 0xFFFF; // Seed for CRC calculation
const uint8_t *c = (const uint8_t *)c_ptr;
while (len--)
crc = (crc << 8) ^ crctable[((crc >> 8) ^ *c++)];
return crc;
}
Your CRC function can easily be converted to C++ so that it can go into a *.cpp file. All you need to do is use an explicit cast when you initialise your c
pointer. Here's the 'proper' C++ way to do it:
const uint8_t *c = static_cast<const uint8_t*>(c_ptr);
However, an old C-style cast would also work:
const uint8_t *c = (const uint8_t*)c_ptr;
The problem is basically that C can be a little more permissive about letting you convert pointers implicitly between types. To do it in C++, you need to tell the compiler explicitly that the conversion is intentional.