It's an example of taking serial i/o from terminal, getting values from text and handling unwanted input.
It's also a decimal to hex and binary converter.
Just be sure that your terminal adds either newline or carriage return when it transmits.
So there it is....
// Decimal Long Int to HEX & BIN Converter
// It -only- expects integers, space delimits, negative values allowed
// make sure the serial monitor ends lines with newline or carriage return.
char B; // bytebuffer -- allocated only once
long V; // for storing number while reading
byte charCount = 0; // how many digits or bytes of garbage
byte stateBits = 0; // bit 0 is sign, bit 1 is reading garbage
void setup() {
Serial.begin(9600);
Serial.println("Convert dec to hex and bin");
Serial.println("Enter digits, - or space through terminal.");
}
void loop(void) { // read one or no character each pass
if (Serial.available()) {
charCount += 1;
B = Serial.read();
Serial.print(B, BYTE); // echo each character as read
// Serial.print(" "); // debuggy informy stuff
// Serial.print(B, HEX);
// Serial.print(" : ");
if ( !(stateBits & 2)) { // do if 'garbage in' is NOT set
if ((B >= '0') && (B <= '9')) { //// is B a digit?
if ( charCount > 10 ) { //
// print_value();
print_error(" overflow ");
return;
}
if (V >= 300000000) { // will adding a digit overflow value?
// print_value();
print_error( " overflow " );
return;
}
// updating V, one digit at a time
V *= 10; // shift the previous vale up a decimal place
V += (B - '0'); // add the new ones
return;
}
else if ((B == '-') && (charCount == 1)) { // leading minus only
stateBits |= 1; // V will be made negative at end of read
charCount = 0; // sign is not a digit
return;
}
else if ((B == ' ') || (B == '\t') || (B == '\r') || (B == '\n')) { // space & tab delimit
if (charCount > 1) { // slice off leading spaces
print_value();
}
else set_zero(); // eat spaces & tabs
return;
}
else { // whatever gets this far is not a valid character
// print_value();
stateBits |= 2; // garbage-in state set ON
// print_error(" long integers please ");
return;
}
}
else { // garbage-in mode, check for delimiters if so then print error
if ((B == ' ') || (B == '\t') || (B == '\r') || (B == '\n')) {
// Serial.println(" decimal integers please!");
if (charCount > 1) { // don't println just for a delimiter
Serial.println(); // just let the garbage echo be the message
set_zero();
}
else charCount = 0; // eat the spaces
}
return;
}
}
}
void print_value( void ) { // print dec hex bin
if (stateBits & 1) V = -V;
Serial.print(" > ");
Serial.print(V, DEC);
Serial.print(" : 0x");
Serial.print(V, HEX);
Serial.print(" : 0b");
Serial.println(V, BIN);
set_zero();
}
void print_error(char *errmsg) {
/* if (Serial.available()) {
while (Serial.available()) {
B = Serial.read();
Serial.print(B, BYTE);
}
}
*/
Serial.print(" *error* " );
Serial.println(errmsg);
set_zero();
stateBits = 2; // garbage-in, look for a delimiter then start over
}
void set_zero( void ) {
V = 0; // init, start looking for the next value
charCount = 0;
stateBits = 0;
}