#include #include #include "BufferClass.h" #define RXD 4 #define TXD 3 #define CLK 2 #define WAIT_DATA while(!receiveBuffer.dataExist()) #define WAIT 30 volatile ReceiveBufferClass receiveBuffer; File dataFile; char fileName[13]; void setup() { pinMode(TXD, OUTPUT); pinMode(RXD, INPUT); pinMode(CLK, INPUT); attachInterrupt(digitalPinToInterrupt(CLK), receiveBit, FALLING); SD.begin(10); //CSは10pinで制御 } void loop() { if(receiveBuffer.dataExist()) { switch(receiveBuffer.getData()) { case 1: fileWrite(); break; case 2: fileRead(); break; } } } //データ受信割り込みエントリ void receiveBit() { static uint8_t counter = 0, rdata = 0; uint8_t onebit; onebit = digitalRead(RXD); rdata += (onebit << (7 - counter)); if(++counter > 7) { //バッファに受信データを入れる receiveBuffer.setData(rdata); counter = 0; rdata = 0; } } //SD書き込み void fileWrite() { uint8_t data, p; uint16_t fileSize; //ファイルのサイズ受信 WAIT_DATA; data = receiveBuffer.getData(); fileSize = data << 8; WAIT_DATA; data = receiveBuffer.getData(); fileSize += data; //ファイル名受信 p = 0; do { WAIT_DATA; data = receiveBuffer.getData(); fileName[p++] = data; } while(data != 0); //すでに同名ファイルがあれば削除 if(SD.exists(fileName)) SD.remove(fileName); dataFile = SD.open(fileName, FILE_WRITE); //データ受信&SD書き込み for(int i=0; i> (7 - i)) & 1; digitalWrite(TXD, onebit); delayMicroseconds(WAIT); digitalWrite(CLK, LOW); delayMicroseconds(WAIT); digitalWrite(CLK, HIGH); } delay(WAIT); } //データ送信時の割り込みエントリ void dummy() { //割り込みを禁止するとdelay()の動作に支障があるので //ダミーの割り込みエントリで対応 } //SD読み込み void fileRead() { uint8_t data, p; unsigned int fileSize; byte b; //ファイル名受信 p = 0; do { WAIT_DATA; data = receiveBuffer.getData(); fileName[p++] = data; } while(data != 0); dataFile = SD.open(fileName); fileSize = (unsigned int)dataFile.size(); //割り込みによるデータ受信を無効にする attachInterrupt(digitalPinToInterrupt(CLK), dummy, FALLING); pinMode(CLK, OUTPUT); digitalWrite(CLK, HIGH); delay(WAIT); //ファイルのサイズ sendByte((fileSize & 0xff00) >> 8); sendByte(fileSize & 0xff); //データ送信 for(int i=0; i