Files
esp32-learning/serialuart/serialuart.ino

114 lines
3.0 KiB
Arduino
Raw Normal View History

2026-05-30 00:26:20 -04:00
#define BUFLEN 512
#define SERIALSPEED 115200
#define ERROR_SYNTAX 1
#define ERROR_COMMAND 2
typedef struct CmdParser {
char buffer[BUFLEN] = {0};
char atoibuf[32] = {0};
char *tok = NULL;
char *atoiptr = NULL;
int pin = 0;
} CmdParser;
void setup() {
Serial0.begin(SERIALSPEED, SERIAL_8N1, 21, 14);
}
int parse_digit_from_buffer(CmdParser *parser)
{
parser->atoiptr = parser->tok;
while ( *parser->atoiptr != ' ' && *parser->atoiptr != 0x00 ) {
if ( !isDigit((char)*parser->atoiptr) ) {
Serial0.printf("Expected digit, found %s\n", parser->tok);
return ERROR_SYNTAX;
} else if ( parser->atoiptr == ((char *)&parser->buffer + 512 ) ) {
Serial0.printf("Reached end of string looking for next token : %s\n", parser->tok);
return ERROR_SYNTAX;
}
parser->atoiptr++;
}
strncpy((char *)&parser->atoibuf, parser->tok, (int)(parser->atoiptr - parser->tok));
parser->tok = parser->atoiptr;
return 0;
}
int command_writepin(CmdParser *parser)
{
int rc = 0;
parser->tok = strtok(NULL, " ");
rc = parse_digit_from_buffer(parser);
if ( rc != 0 ) {
return rc;
}
parser->pin = atoi((char *)&parser->atoibuf);
parser->tok = strtok(NULL, " ");
if ( strncmp(parser->tok, "high", 4) == 0 ) {
digitalWrite(parser->pin, HIGH);
Serial0.printf("digitalWrite(%d, HIGH)", parser->pin);
} else if ( strncmp(parser->tok, "low", 3) == 0 ) {
digitalWrite(parser->pin, LOW);
Serial0.printf("digitalWrite(%d, LOW)", parser->pin);
} else {
Serial0.printf("Expected HIGH or LOW, found %s", parser->tok);
return ERROR_SYNTAX;
}
return 0;
}
int command_setpin(CmdParser *parser)
{
int rc = 0;
parser->tok = strtok(NULL, " ");
rc = parse_digit_from_buffer(parser);
if ( rc != 0 ) {
return rc;
}
parser->pin = atoi((char *)&parser->atoibuf);
parser->tok = strtok(NULL, " ");
if ( strncmp(parser->tok, "input", 5) == 0 ) {
pinMode(parser->pin, INPUT);
Serial0.printf("pinMode(%d, INPUT)", parser->pin);
} else if ( strncmp(parser->tok, "output", 6) == 0 ) {
pinMode(parser->pin, OUTPUT);
Serial0.printf("pinMode(%d, OUTPUT)", parser->pin);
} else {
Serial0.printf("Expected input or output, found %s", parser->tok);
return ERROR_SYNTAX;
}
return 0;
}
int parse_command(CmdParser *parser)
{
parser->tok = strtok((char *)&parser->buffer, " ");
if ( strcmp(parser->tok, "setpin") == 0 ) {
return command_setpin(parser);
} else if ( strcmp(parser->tok, "writepin") == 0 ) {
return command_writepin(parser);
}
return ERROR_COMMAND;
}
void loop() {
CmdParser parser;
memset((void *)&parser, 0x00, sizeof(CmdParser));
Serial0.println("");
Serial0.println("READY");
while ( Serial0.available() == 0 ) {
delay(10);
}
if ( Serial0.readBytesUntil('\0', (char *)&parser.buffer, BUFLEN) != 0 ) {
switch ( parse_command(&parser) ) {
case ERROR_SYNTAX:
Serial0.println("Syntax error");
break;
case ERROR_COMMAND:
Serial0.println("Unknown command");
break;
case 0:
return;
}
}
}