Gostaria de saber se existe uma maneira de chamar funções contidas em arquivos C usando um esboço do Arduino?
Meu arquivo C declara e define uma função. Para poupar a definição da função bagunçada no meu esboço do Arduino, gostaria de chamar a função diretamente do esboço.
Existe uma maneira padrão de fazer isso usando Arduino e C? Aqui está o esboço:
#include "crc16.h";
void setup(){
}
void loop(){
CalculateCRC16("<09M", 4);
}
e este é o arquivo C aparado:
#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
nome do usuário
fonte
fonte
const void *c_ptr
econst uint8_t *c = c_ptr;
. A mensagem de erro menciona uma conversão inválida entre tipos.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.)
Respostas:
Você pode incluir "C" externo como o seguinte:
E o arquivo crc16.h pode ser (algumas pequenas correções, o #pragma uma vez, um elenco):
fonte
Sua função CRC pode ser facilmente convertida em C ++ para que possa entrar em um arquivo * .cpp. Tudo o que você precisa fazer é usar uma conversão explícita ao inicializar o
c
ponteiro. Aqui está a maneira 'adequada' de C ++ de fazer isso:No entanto, um elenco antigo de estilo C também funcionaria:
O problema é basicamente que C pode ser um pouco mais permissivo em permitir converter ponteiros implicitamente entre tipos. Para fazer isso em C ++, você precisa informar explicitamente ao compilador que a conversão é intencional.
fonte
Sim, basta copiar sua linha de declaração no seu esboço:
fonte