以前に書いた単純シリアル出力装置プロジェクトのサンプルコード
EEPROMへのコマンド書き込みが可能
プロジェクトの作例
短いコードなので説明は割愛
どこかからのコピペが混じってると思う
#include <EEPROM.h> const int buttonPin = A0; const int ledPin1 = 13; int eepWriteFlag = 0; int eepAddr = 0; int buttonState = 0; int setupFlag = 0; char str[64]; // 数字(文字列)の受信用配列 char str2[64]; void setup(){ int i; pinMode(ledPin1, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); delay(100); //ボタン押しっぱなし起動→セットアップモード if(digitalRead(buttonPin) == LOW) { //セットアップモード:9600pps固定 setupFlag = 1; Serial.begin(9600); Serial.println("Setup Mode"); } else { //非セットアップモード //先頭に記述されている#pps XXXX よりシリアル接続 eepAddr = 0; for(i = 0; i < 64; i++) { str[i] = (char)EEPROM.read(eepAddr); eepAddr++; if(str[i] == '\r') break; } if(strEq(str, "#pps")) { long ppsBuf; for(i = 0; i < 64; i++) { str2[i] = 0; } for(i = 0; i < 64; i++) { if(str[i+5] == '\r') break; str2[i] = str[i+5]; } ppsBuf = atol(str2); Serial.begin(ppsBuf); Serial.print("pps:"); Serial.print(ppsBuf); Serial.println(); } else { Serial.begin(9600); Serial.println("pps readError"); } } } void loop(){ int i, j; if(setupFlag == 0) { buttonState = digitalRead(buttonPin); if (buttonState == LOW) { // turn LED on: digitalWrite(ledPin1, HIGH); serialOut(0); digitalWrite(ledPin1, LOW); } } else { //ミソはバッファクリア―! for(i = 0; i < 64; i++) str[i] = 0; recvStr(str); Serial.println(str); if(strEq(str, "#start")) { Serial.println("detect #start"); eepWriteFlag = 1; } else if(strEq(str, "#end")) { Serial.println("detect #end"); eepWriteFlag = 0; EEPROM.write(eepAddr, (byte)'\n'); eepAddr = 0; } else if(strEq(str, "#read")) { Serial.println("detect #read"); eepAddr = 0; for(j = 0; j < 512; j++) { for(i = 0; i < 64; i++) { str[i] = 0; } for(i = 0; i < 64; i++) { str[i] = (char)EEPROM.read(eepAddr); eepAddr++; if(str[i] == '\r') break; } Serial.println(str); if(str[0] == '\n') break; } } else if(strEq(str, "#clear")) { Serial.println("detect #clear"); for(i = 0; i < 1024; i++) { eepWriteFlag = 0; eepAddr = 0; EEPROM.write(i, 0); } } else if(strEq(str, "#go")) { //#readとの違いはディレイやppsなど一部パースすること Serial.println("detect #go"); eepAddr = 0; serialOut(1); } else if(eepWriteFlag) { for(i = 0; i < 64; i++) { EEPROM.write(eepAddr, (byte)str[i]); eepAddr++; if(str[i] == '\r') break; } } } } //※文字列*baseStrの冒頭が*headStrと等しいかどうかをチェックする //等しければ1、そうでなければ0 int strEq(char *checkStr, char *headStr) { int size = sizeof(headStr) / sizeof(headStr[0]); int i; int ret = 1; for(i = 0; i < size; i++) { if(checkStr[i] != headStr[i]) { ret = 0; break; } } return ret; } void recvStr(char *buf) { int i = 0; char c; while (1) { if (Serial.available()) { c = Serial.read(); buf[i] = c; if (c == '\r') break; i++; } } buf[i] = '\r'; } void serialOut(int debugFlag) { int i,j; eepAddr = 0; for(j = 0; j < 16; j++) { for(i = 0; i < 64; i++) { str[i] = 0; } for(i = 0; i < 64; i++) { str[i] = (char)EEPROM.read(eepAddr); eepAddr++; if(str[i] == '\r') { break; } } if(strEq(str, "#delay")) { int delayBuf; for(i = 0; i < 64; i++) { str2[i] = 0; } for(i = 0; i < 64; i++) { if(str[i+7] == '\r') break; str2[i] = str[i+7]; } delayBuf = atoi(str2); if(debugFlag) { Serial.print("delay:"); Serial.print(delayBuf); Serial.println(); } else { delay(delayBuf); } } else if(strEq(str, "#pps")) { if(debugFlag) { Serial.println("pps Skip"); } } else { Serial.println(str); } if(str[0] == '\n') break; } }
0 件のコメント:
コメントを投稿