將.c與.h檔案導入至Arduino中並從電腦傳送資料進行計算
有些情況下在寫演算法的時候,會以c語言的形式撰寫,撰寫完之後,我們會想要把這個c語言的程式碼導入至Arduino當中。不過在Arduino裡面是以.cpp為主的檔案,如果要導入.c與.h就要有一些操作的方式,此處就是來講解導入.c與.h檔的方法,導入之後,我們會從電腦傳送資料至Arduino當中進行運算。計算完後,再將運算結果丟回電腦。
–
此處我們只講解Arduino端程式,其他像是電腦端的程式就是與上一篇簡單實現電腦讀取csv檔資料並與Arduino進行傳輸,提到的相同,做的事情就是在電腦上讀取csv檔資料後,傳輸至Arduino當中進行計算。
Arduino端程式
程式架構
我們總共在Arduino端有三個檔案,同時擺在同一個資料夾當中,cal主要是放演算法的程式,sketch_feb2a.ino則是Arduino端的主程式。
cal.c
cal.h
sketch_feb2a.ino
cal.h檔案程式
在.h檔程式裡面,宣告了#ifdef,#define,#endif避免重複引入header files。
然後宣告了函數的輸出為int型式,然後輸入的變數為整數int a
#ifndef CAL_H
#define CAL_H
int Calculation(int a);
#endif
cal.c檔案程式
把cal.h引入近來,在函數裡面簡單做了一個a+b的運算,其中a是輸入的變數,b的話是一個常數,計算完成之後,將c變數傳出來。
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include "cal.h"
int Calculation(int a)
{
int b;
int c;
b = 1;
c = a + b;
return c;
}
sketch_feb2a.ino檔案程式
在一開始的地方要用extern “C”將cal的標頭檔引入進來,因為.ino平常處理的是C++程式,加入extern才可以用c的方式處理標頭檔。
一樣是接收資料,讀進來的資料會轉換成int儲存成number變數,會將number丟入到calculation的計算當中,計算完成之後,我們就可將計算完成的值令為value。
extern "C"
{
#include "cal.h"
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
String data = Serial.readStringUntil('\n'); // 讀取從電腦發送的資料,直到換行符號
data.trim(); // 移除可能的空格
int number = data.toInt();
int value;
value = Calculation(number);
Serial.print(value);
Serial.print('\n');
}
}
實作結果
開啟python檔案,傳輸csv檔資料後,Arduino上面會進行運算,再丟回運算結果。
像是從電腦傳遞數值1,計算完,就是1+1=2 就會接收2的數值,像是傳遞2,計算完,就會接收2+1=3 接收3的數值。