Skip to content

Instantly share code, notes, and snippets.

@ultramcu
Created May 7, 2015 12:24
Show Gist options
  • Save ultramcu/ff6ecf31829771e6393e to your computer and use it in GitHub Desktop.
Save ultramcu/ff6ecf31829771e6393e to your computer and use it in GitHub Desktop.
Simple State Machine to receive message via Serial Port for Arduino
/*
Simple State Machine to receive message via Serial Port for Arduino
=======
WEBSITE
=======
https://www.facebook.com/appstack.cc
http://www.appstack.cc
<------------------------------------------------------------------->
@Author
- ultra_mcu@Piak Studiolo LEGO eiei
@Date
- 2015/03/04 , Create
@Tool
- Arduino 1.0.6 on OSX
*/
#include <stdint.h>
#include <stdbool.h>
#define _MAX_TEXT_BUFFER_ 50
enum
{
STATE_1 = 1,
STATE_2,
STATE_3,
};
char TEXT_BUEFFER[_MAX_TEXT_BUFFER_];
uint8_t TEXT_BUEFFER_CNT = 0;
uint8_t STATE = STATE_1;
void setup()
{
Serial.begin(115200);
memset(TEXT_BUEFFER,0,_MAX_TEXT_BUFFER_);
}
void process_serial(char data,uint8_t *state,char *buffer,uint8_t *buffer_cnt)
{
switch(*state)
{
case STATE_1:
{
if(data == '<')
{
*state = STATE_2;
}
}
break;
case STATE_2:
{
if(data == '<')
{
memset(buffer,0,_MAX_TEXT_BUFFER_);
*buffer_cnt = 0;
*state = STATE_3;
}
else if(data == '>')
{
if(*buffer_cnt > 0)
{
Serial.print("Text : ");
Serial.println(buffer);
}
memset(buffer,0,_MAX_TEXT_BUFFER_);
*buffer_cnt = 0;
*state = STATE_1;
}
else
{
if(*buffer_cnt < _MAX_TEXT_BUFFER_)
{
buffer[(*buffer_cnt)++] = data;
}
}
}
break;
case STATE_3:
{
if(data == '>')
{
*state = STATE_1;
}
else if(data == '<')
{
memset(buffer,0,_MAX_TEXT_BUFFER_);
*buffer_cnt = 0;
}
else
{
buffer[(*buffer_cnt)++] = data;
*state = STATE_2;
}
}
break;
}
}
void loop()
{
if(Serial.available()> 0)
{
process_serial(Serial.read(),&STATE,TEXT_BUEFFER,&TEXT_BUEFFER_CNT);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment