@@ -3401,6 +3401,10 @@ const char version[] = __DATE__ " " __TIME__;
34013401 const char * InvalidData_Float = " Invalid data. Expected float -3.4028235E+38-3.4028235E+38 instead got " ;
34023402 const char * InvalidData_UnsignedLong = " Invalid data. Expected unsigned long 0-4294967295 instead got " ;
34033403 const char * InvalidData_TrueFalse = " Invalid data. Expected True/False or 1/0" ;
3404+ const char * InvalidData_String99 = " Invalid data. Expected string <= 99 chars" ;
3405+ const char * InvalidData_String6 = " Invalid data. Expected string <= 6 chars" ;
3406+ const char * InvalidData_String2 = " Invalid data. Expected string <= 2 chars" ;
3407+ const char * InvalidData_String1 = " Invalid data. Expected string <= 1 chars" ;
34043408
34053409 const char exNone[] PROGMEM = " :<Unknown>" ;
34063410 const char exBool[] PROGMEM = " :<True/False>" ;
@@ -3529,6 +3533,9 @@ const char version[] = __DATE__ " " __TIME__;
35293533 Serial.println ();
35303534 }
35313535
3536+ const byte MAX_LEN = 250 ;
3537+ char inData[MAX_LEN] = {' \0 ' };
3538+ byte index = 0 ;
35323539 const char CMD_DELETE[] PROGMEM = " Delete" ;
35333540 const char CMD_PRINT[] PROGMEM = " Print" ;
35343541 const char CMD_MODEM[] PROGMEM = " Modem" ;
@@ -3539,15 +3546,25 @@ const char version[] = __DATE__ " " __TIME__;
35393546 readModem ();
35403547 // usb serial commands are handled here
35413548 bool gotCMD = false ;
3542- char inData[250 ];
3543- if (Serial.available ()) {
3544- memset (inData,' \0 ' ,sizeof (inData));
3545- Serial.readBytesUntil (' \n ' , inData, sizeof (inData));
3546- Serial.print (F (" ECHO " ));Serial.println (inData);
3547- if (inData[0 ]==' C' && inData[1 ]==' M' && inData[2 ]==' D' && inData[3 ]==' :' ) gotCMD=true ;
3548- if (inData[0 ]==' ?' ) printOutSerialCommands ();
3549- // if (inData[0]=='M' && inData[1]=='S' && inData[2]=='G' && inData[3]==':') sendMessage=true;
3549+ while (Serial.available ()) {
3550+ char c = Serial.read ();
3551+ if (c == ' \n ' ) {
3552+ inData[index] = ' \0 ' ;
3553+ Serial.print (F (" ECHO [" ));Serial.print (index+1 );Serial.print (F (" ] " ));Serial.println (inData);
3554+ if (inData[0 ]==' C' && inData[1 ]==' M' && inData[2 ]==' D' && inData[3 ]==' :' ) gotCMD=true ;
3555+ if (inData[0 ]==' ?' ) printOutSerialCommands ();
3556+ index = 0 ;
3557+ } else {
3558+ if (index < MAX_LEN - 1 ) {
3559+ inData[index++] = c;
3560+ } else {
3561+ // we got to the end of our buffer and never got a \n so lets start over
3562+ index = 0 ;
3563+ break ;
3564+ }
3565+ }
35503566 }
3567+
35513568 if (gotCMD){
35523569 // get the command
35533570 char CMD[30 ]={' \0 ' };
@@ -3732,6 +3749,10 @@ const char version[] = __DATE__ " " __TIME__;
37323749
37333750 } else if (strstr (Setting, MenuItems_Settings_APRS[3 ]) != NULL ) { // "Raw Packet"
37343751 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3752+ if (k>99 ) { // string100 should be no longer than 99 chars (plus \n)
3753+ Serial.print (InvalidData_String99);Serial.println (inData_Value);
3754+ return ;
3755+ }
37353756 inData_Value[k] = inData[i];
37363757 i++; k++;
37373758 }
@@ -3743,6 +3764,10 @@ const char version[] = __DATE__ " " __TIME__;
37433764
37443765 } else if (strstr (Setting, MenuItems_Settings_APRS[4 ]) != NULL ) { // "Comment"
37453766 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3767+ if (k>99 ) { // string100 should be no longer than 99 chars (plus \n)
3768+ Serial.print (InvalidData_String99);Serial.println (inData_Value);
3769+ return ;
3770+ }
37463771 inData_Value[k] = inData[i];
37473772 i++; k++;
37483773 }
@@ -3754,6 +3779,10 @@ const char version[] = __DATE__ " " __TIME__;
37543779
37553780 } else if (strstr (Setting, MenuItems_Settings_APRS[5 ]) != NULL ) { // "Message"
37563781 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3782+ if (k>99 ) { // string100 should be no longer than 99 chars (plus \n)
3783+ Serial.print (InvalidData_String99);Serial.println (inData_Value);
3784+ return ;
3785+ }
37573786 inData_Value[k] = inData[i];
37583787 i++; k++;
37593788 }
@@ -3765,6 +3794,10 @@ const char version[] = __DATE__ " " __TIME__;
37653794
37663795 } else if (strstr (Setting, MenuItems_Settings_APRS[6 ]) != NULL ) { // "Recipient Callsign"
37673796 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3797+ if (k>6 ) { // string7 should be no longer than 6 chars (plus \n)
3798+ Serial.print (InvalidData_String6);Serial.println (inData_Value);
3799+ return ;
3800+ }
37683801 inData_Value[k] = inData[i];
37693802 i++; k++;
37703803 }
@@ -3776,6 +3809,10 @@ const char version[] = __DATE__ " " __TIME__;
37763809
37773810 } else if (strstr (Setting, MenuItems_Settings_APRS[7 ]) != NULL ) { // "Recipient SSID"
37783811 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3812+ if (k>2 ) { // string3 should be no longer than 2 chars (plus \n)
3813+ Serial.print (InvalidData_String2);Serial.println (inData_Value);
3814+ return ;
3815+ }
37793816 inData_Value[k] = inData[i];
37803817 i++; k++;
37813818 }
@@ -3788,6 +3825,10 @@ const char version[] = __DATE__ " " __TIME__;
37883825
37893826 } else if (strstr (Setting, MenuItems_Settings_APRS[8 ]) != NULL ) { // "My Callsign"
37903827 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3828+ if (k>6 ) { // string7 should be no longer than 6 chars (plus \n)
3829+ Serial.print (InvalidData_String6);Serial.println (inData_Value);
3830+ return ;
3831+ }
37913832 inData_Value[k] = inData[i];
37923833 i++; k++;
37933834 }
@@ -3799,6 +3840,10 @@ const char version[] = __DATE__ " " __TIME__;
37993840
38003841 } else if (strstr (Setting, MenuItems_Settings_APRS[9 ]) != NULL ) { // "Callsign SSID"
38013842 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3843+ if (k>2 ) { // string3 should be no longer than 2 chars (plus \n)
3844+ Serial.print (InvalidData_String2);Serial.println (inData_Value);
3845+ return ;
3846+ }
38023847 inData_Value[k] = inData[i];
38033848 i++; k++;
38043849 }
@@ -3811,6 +3856,10 @@ const char version[] = __DATE__ " " __TIME__;
38113856
38123857 } else if (strstr (Setting, MenuItems_Settings_APRS[10 ]) != NULL ) { // "Destination Callsign"
38133858 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3859+ if (k>6 ) { // string7 should be no longer than 6 chars (plus \n)
3860+ Serial.print (InvalidData_String6);Serial.println (inData_Value);
3861+ return ;
3862+ }
38143863 inData_Value[k] = inData[i];
38153864 i++; k++;
38163865 }
@@ -3822,6 +3871,10 @@ const char version[] = __DATE__ " " __TIME__;
38223871
38233872 } else if (strstr (Setting, MenuItems_Settings_APRS[11 ]) != NULL ) { // "Destination SSID"
38243873 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3874+ if (k>2 ) { // string3 should be no longer than 2 chars (plus \n)
3875+ Serial.print (InvalidData_String2);Serial.println (inData_Value);
3876+ return ;
3877+ }
38253878 inData_Value[k] = inData[i];
38263879 i++; k++;
38273880 }
@@ -3834,6 +3887,10 @@ const char version[] = __DATE__ " " __TIME__;
38343887
38353888 } else if (strstr (Setting, MenuItems_Settings_APRS[12 ]) != NULL ) { // "PATH1 Callsign"
38363889 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3890+ if (k>6 ) { // string7 should be no longer than 6 chars (plus \n)
3891+ Serial.print (InvalidData_String6);Serial.println (inData_Value);
3892+ return ;
3893+ }
38373894 inData_Value[k] = inData[i];
38383895 i++; k++;
38393896 }
@@ -3845,6 +3902,10 @@ const char version[] = __DATE__ " " __TIME__;
38453902
38463903 } else if (strstr (Setting, MenuItems_Settings_APRS[13 ]) != NULL ) { // "PATH1 SSID"
38473904 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3905+ if (k>2 ) { // string3 should be no longer than 2 chars (plus \n)
3906+ Serial.print (InvalidData_String2);Serial.println (inData_Value);
3907+ return ;
3908+ }
38483909 inData_Value[k] = inData[i];
38493910 i++; k++;
38503911 }
@@ -3857,6 +3918,10 @@ const char version[] = __DATE__ " " __TIME__;
38573918
38583919 } else if (strstr (Setting, MenuItems_Settings_APRS[14 ]) != NULL ) { // "PATH2 Callsign"
38593920 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3921+ if (k>6 ) { // string7 should be no longer than 6 chars (plus \n)
3922+ Serial.print (InvalidData_String6);Serial.println (inData_Value);
3923+ return ;
3924+ }
38603925 inData_Value[k] = inData[i];
38613926 i++; k++;
38623927 }
@@ -3868,6 +3933,10 @@ const char version[] = __DATE__ " " __TIME__;
38683933
38693934 } else if (strstr (Setting, MenuItems_Settings_APRS[15 ]) != NULL ) { // "PATH2 SSID"
38703935 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3936+ if (k>2 ) { // string3 should be no longer than 2 chars (plus \n)
3937+ Serial.print (InvalidData_String2);Serial.println (inData_Value);
3938+ return ;
3939+ }
38713940 inData_Value[k] = inData[i];
38723941 i++; k++;
38733942 }
@@ -3880,6 +3949,10 @@ const char version[] = __DATE__ " " __TIME__;
38803949
38813950 } else if (strstr (Setting, MenuItems_Settings_APRS[16 ]) != NULL ) { // "Symbol"
38823951 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3952+ if (k>1 ) { // string2 should be no longer than 1 chars (plus \n)
3953+ Serial.print (InvalidData_String1);Serial.println (inData_Value);
3954+ return ;
3955+ }
38833956 inData_Value[k] = inData[i];
38843957 i++; k++;
38853958 }
@@ -3892,6 +3965,10 @@ const char version[] = __DATE__ " " __TIME__;
38923965
38933966 } else if (strstr (Setting, MenuItems_Settings_APRS[17 ]) != NULL ) { // "Table"
38943967 while (inData[i] != ' \n ' && inData[i] != ' \0 ' ) {
3968+ if (k>1 ) { // string2 should be no longer than 1 chars (plus \n)
3969+ Serial.print (InvalidData_String1);Serial.println (inData_Value);
3970+ return ;
3971+ }
38953972 inData_Value[k] = inData[i];
38963973 i++; k++;
38973974 }
@@ -4225,13 +4302,10 @@ const char version[] = __DATE__ " " __TIME__;
42254302 void writeStructToSd (File& file, void * dataPtr, size_t dataSize, const char * label, bool addNewline = true ) {
42264303 if (file) {
42274304 uint32_t size = file.size ();
4228- // if (size > MAX_FILE_SIZE * WARN_THRESHOLD) {
42294305 if (size >= WARN_AT_BYTES) {
42304306 Serial.print (F (" [WARNING] " ));
42314307 Serial.print (label);
42324308 Serial.print (F (" file is getting large: " ));
4233- // Serial.print(size);
4234- // Serial.println(F(" bytes."));
42354309 printFormattedSize (size);
42364310 Serial.println (F (" ). Consider offloading or deleting." ));
42374311 }
@@ -4452,8 +4526,12 @@ void extractMsgCallParts(const char input[15], char callsign[7], char ssid[3]) {
44524526#pragma endregion
44534527
44544528void setup (){
4455-
4456- Serial.begin (115200 );
4529+ // chose the baud rate wisely
4530+ // the arduino has a serial buffer size of 64 bytes.
4531+ // if the data is received too fast, the buffer may overflow before the arduino gets to Serial.read() it
4532+ // at 9600 baud, we can read a 131 char string without losing data. this is long enough for our 99 char limit for strings (raw, comment, and message) plus the command structure
4533+ // for example: CMD:Settings:APRS:Message Text:0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
4534+ Serial.begin (9600 );
44574535 Serial1.begin (9600 ); // modem
44584536 Serial2.begin (9600 ); // gps
44594537 while (!Serial1) // wait for modem
0 commit comments