From 1a1e92a709bf5d2129dc77e31a9faccd86083b9a Mon Sep 17 00:00:00 2001 From: Rob French Date: Sun, 7 Jun 2020 15:26:37 -0500 Subject: [PATCH] Working! Implemented a more reasonable serial reader. --- ubitx_20/cat_libs.ino | 65 ++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/ubitx_20/cat_libs.ino b/ubitx_20/cat_libs.ino index 771bbe7..0afb739 100644 --- a/ubitx_20/cat_libs.ino +++ b/ubitx_20/cat_libs.ino @@ -832,51 +832,53 @@ void Check_Cat(byte fromType) static PrefixID readPrefix; static uint8_t readLength; - static IOPMessage msg; + static IOPMessage msg; + static bool read_in_progress = false; //Check Serial Port Buffer - if (Serial.available() == 0) + if (Serial.available() == 0 && !read_in_progress) { //Set Buffer Clear status - rxBufferCheckCount = 0; + //rxBufferCheckCount = 0; return; } // KC4UPR - IOP update: changed this to 6 characters, because we're going to have a // first character which defines if this is CAT or IOP. - else if (Serial.available() < 6) //5) + else // if (Serial.available() < 6) //5) { - //First Arrived - if (rxBufferCheckCount == 0) - { + if (!read_in_progress) { + byte first = Serial.read(); + readPrefix = byteToPrefix(first); + readLength = byteToLength(first); + rxBufferCheckCount = Serial.available(); - rxBufferArriveTime = millis() + CAT_RECEIVE_TIMEOUT; //Set time for timeout - } - else if (rxBufferArriveTime < millis()) //timeout - { - //Clear Buffer - for (i = 0; i < Serial.available(); i++) - rxBufferCheckCount = Serial.read(); + rxBufferArriveTime = millis() + CAT_RECEIVE_TIMEOUT; - rxBufferCheckCount = 0; + read_in_progress = true; } - else if (rxBufferCheckCount < Serial.available()) //increase buffer count, slow arrived - { - rxBufferCheckCount = Serial.available(); - rxBufferArriveTime = millis() + CAT_RECEIVE_TIMEOUT; //Set time for timeout + + if (Serial.available() < readLength) { // not ready to read everything yet (not enough bytes) + + if (rxBufferCheckCount < Serial.available()) { // increase buffer count, slow arrival + rxBufferCheckCount = Serial.available(); + rxBufferArriveTime = millis() + CAT_RECEIVE_TIMEOUT; // update time for timeout + + } else if (rxBufferArriveTime < millis()) { // timeout, so clear buffer + for (i = 0; i < Serial.available(); i++) + rxBufferCheckCount = Serial.read(); + rxBufferCheckCount = 0; + read_in_progress = false; + + } + + return; + } + + for (int i = 0; i < readLength; i++) { + CAT_BUFF[i] = Serial.read(); } - return; } - - //Arived CAT DATA - // KC4UPR - IOP update - 6 characters; first character determines mode (CAT or IOP) - // Will adjust based on readlength - byte first = Serial.read(); - readPrefix = byteToPrefix(first); - readLength = byteToLength(first); - for (int i = 0; i < readLength; i++) { - CAT_BUFF[i] = Serial.read(); - } - + // KC4UPR: I don't understand why this is here or how/when it will ever get called, but I will leave // it alone for now. if (isProcessCheck_Cat == 1) @@ -1013,6 +1015,7 @@ void Check_Cat(byte fromType) } isProcessCheck_Cat = 0; + read_in_progress = false; } void Init_Cat(long baud, int portConfig)