將.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的數值。

Similar Posts