Я хотел бы знать, есть ли способ вызова функций, которые содержатся в файлах C, используя эскиз Arduino?
Мой C-файл объявляет и определяет функцию. Чтобы не вносить грязное определение функции в мой эскиз Arduino, я бы хотел вызвать функцию прямо из эскиза.
Есть ли стандартный способ сделать это, используя Arduino и C? Вот эскиз:
#include "crc16.h";
void setup(){
}
void loop(){
CalculateCRC16("<09M", 4);
}
и это урезанный файл C:
#include <stdio.h>
#include <stdint.h>
uint16_t crctable[256] =
{
0x0000, 0x1189,.....
uint16_t // Returns Calculated CRC value
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 = c_ptr;
while (len--)
crc = (crc << 8) ^ crctable[((crc >> 8) ^ *c++)];
return crc;
}
arduino-uno
software
c
user_name
источник
источник
const void *c_ptr
иconst uint8_t *c = c_ptr;
. В сообщении об ошибке упоминается недопустимое преобразование между типами.In function uint16_t CalculateCRC16(uint16_t, const void*, size_t)': 46 invalid conversion from
const void * 'toconst uint8_t*' In function int main()': 57 system' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.)
Ответы:
Вы можете ввести "C" #include следующим образом:
И файл crc16.h может быть (некоторые мелкие исправления, однажды #pragma, приведение):
источник
Ваша функция CRC может быть легко преобразована в C ++, чтобы она могла перейти в файл * .cpp. Все, что вам нужно сделать, это использовать явное приведение при инициализации
c
указателя. Вот «правильный» C ++ способ сделать это:Тем не менее, старый C-стиль также будет работать:
Проблема в основном в том, что C может позволить вам неявно преобразовывать указатели между типами. Чтобы сделать это в C ++, вам нужно явно указать компилятору, что преобразование является преднамеренным.
источник
Да, просто скопируйте строку декларации в свой эскиз:
источник