Saya ingin tahu apakah ada cara untuk memanggil fungsi yang terdapat dalam file C menggunakan sketsa Arduino?
File C saya mendeklarasikan dan mendefinisikan suatu fungsi. Untuk menyimpan menempatkan definisi fungsi yang berantakan ke dalam sketsa Arduino saya, saya ingin memanggil fungsi langsung dari sketsa.
Apakah ada cara standar untuk melakukan ini menggunakan Arduino dan C? Ini sketsanya:
#include "crc16.h";
void setup(){
}
void loop(){
CalculateCRC16("<09M", 4);
}
dan ini adalah file C yang dipangkas:
#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
nama pengguna
sumber
sumber
const void *c_ptr
danconst uint8_t *c = c_ptr;
. Pesan kesalahan menyebutkan konversi yang tidak valid antara jenis.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.)
Jawaban:
Anda dapat menggunakan "C" #include seperti yang berikut:
Dan file crc16.h bisa berupa (beberapa perbaikan kecil, #pragma sekali, seorang pemain):
sumber
Fungsi CRC Anda dapat dengan mudah dikonversi ke C ++ sehingga dapat masuk ke file * .cpp. Yang perlu Anda lakukan adalah menggunakan gips eksplisit ketika Anda menginisialisasi
c
pointer Anda . Inilah cara 'pantas' C ++ untuk melakukannya:Namun, pemeran gaya C lama juga akan bekerja:
Masalahnya pada dasarnya adalah bahwa C dapat sedikit lebih permisif tentang membiarkan Anda mengkonversi pointer secara implisit antara tipe. Untuk melakukannya di C ++, Anda perlu memberi tahu kompiler secara eksplisit bahwa konversi disengaja.
sumber
Ya, cukup salin baris deklarasi di sketsa Anda:
sumber