Je voudrais savoir s'il existe un moyen d'appeler des fonctions contenues dans des fichiers C à l'aide d'un croquis Arduino?
Mon fichier C déclare et définit une fonction. Pour éviter de mettre la définition de la fonction désordonnée dans mon croquis Arduino, je voudrais appeler la fonction directement à partir du croquis.
Existe-t-il un moyen standard de le faire en utilisant Arduino et C? Voici le croquis:
#include "crc16.h";
void setup(){
}
void loop(){
CalculateCRC16("<09M", 4);
}
et voici le fichier C réduit:
#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
Nom d'utilisateur
la source
la source
const void *c_ptr
etconst uint8_t *c = c_ptr;
. Le message d'erreur mentionne une conversion non valide entre les types.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.)
Réponses:
Vous pouvez extern "C" #include comme suit:
Et le fichier crc16.h pourrait être (quelques corrections mineures, le #pragma une fois, un cast):
la source
Votre fonction CRC peut facilement être convertie en C ++ afin qu'elle puisse aller dans un fichier * .cpp. Tout ce que vous devez faire est d'utiliser une distribution explicite lorsque vous initialisez votre
c
pointeur. Voici la manière «appropriée» de le faire en C ++:Cependant, un ancien casting de style C fonctionnerait également:
Le problème est que C peut être un peu plus permissif pour vous permettre de convertir implicitement des pointeurs entre types. Pour le faire en C ++, vous devez dire explicitement au compilateur que la conversion est intentionnelle.
la source
Oui, copiez simplement sa ligne de déclaration dans votre croquis:
la source