以前に書いた単純シリアル出力装置プロジェクトのサンプルコード
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;
}
}






















