2015年5月22日金曜日

単純シリアル出力装置のコード

以下コード表示テスト
以前に書いた単純シリアル出力装置プロジェクトのサンプルコード
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 件のコメント:

コメントを投稿