An error is occurring, but where?

I have a working project already, but I have what seems to me like it is a dumb question to ask, I have searched and searched but can't quite get an answer that makes sense to me. My mega is receiving data on Serial1 at 2400 baud, very slow by almost anyone's standards, but I am getting dirty data consistently and can't seem to find out if the device sending the data is faulty or if my coding is faulty. I've read through Robin's Serial Input Basics, https://forum.arduino.cc/t/serial-input-basics/278284
but the scenarios he discusses don't seem to fit my situation. The data that is coming in is comma separated ASCII from a Battery Monitor is on a constant loop repeating stream with no start or end character. One of the pieces of data is the % symbol, which occurs once per loop, so I search for that. Doing this I have essentially made my own 'Start' character, whose data comes in cleanly every cycle. It's the Current data, whose identification is 'AMPS', that I am getting what seems to bleedover from a different piece of data, that gets taken into the Arduino. The 'V' or Battery Volts might come in as 12.8, and the 'AMPs' will come in as, 128, which I know is an impossibility. How can I troubleshoot this out? With code or something else. To get my data, I'm using:

<
while(!Serial1.available()){}
char a = Serial1.read();
if(a =='%') {
/>

Any links that discuss this sort of thing would be appreciated.

Please post all the code, using code tags, and examples of the "dirty data" (the actual characters received).

is that a follow up from Convert streaming ASCII to Text to read Battery Monitor Data - #23 by sdingman

have you built your Serial interface as they recommend?

The bottom example shows how it could be interfaced to another microcontroller for further analysis or processing. The purpose of the signal diode (1N4148) and resistor is to shift the level up slightly so it goes from 0 to 5V instead of -0.6 to 4.4V.

Yes, that's me from I while back that is exactly like I have it wired. And as I said in my inquiry above, All of the remaining data comes through cleanly. It's only the Current going into or out of the battery that is in question.

can you clarify what "dirty" is?


#include <Wire.h>                
#include "RTClib.h"              
#include <SD.h>                  
#include "EmonLib.h"             

const String VERSION_NUMBER = "4.0.3";
RTC_DS3231 rtc;                 
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

EnergyMonitor emonGrid;       
EnergyMonitor emonInverter;            

//Pin identification
const int loadTransfer = 4;     //Transfer Switch Output, High Transfers power to the Inverter, Low returns power to the Grid
const int invPower = 5;         //Inverter Power Output, High turns the Inverter on. Low turns it off
const int invOnInd = 6;         //Inverter On Indicator Input, High - the Inverter is On, Low the Inverter is Off


const int toggleDelay = 3;      //This is the number of times the Battery % must repeat itself before the Arduino believes it's True.
    
String loadTransferToggle="LOW";   
String inverterToggle="LOW";
String gridStatus = "Low";
String strData;                  
int countpctOn;         

int countpctOff;      
int turnOnPoint = -1;// = 95; 
int turnOffPoint = -1;// = 92;
int turnOnPointTemp;
int turnOffPointTemp;

const int chSel = 53;      
File myFile;

int spVoltReadPin = A4;    //Solar Panel Voltage input pin
int spReadVal;             //Solar Panel Read Value on a 0 to 1023 scale
float panelVolt = 0;       //Set the Solar Panel Voltage to 0 initially

String stage = "getRequest";
char character;
String data_from_display = "";
String endChar = String(char(0xff)) + String(char(0xff)) + String(char(0xff));
long watchDog = 0;
long getRequestMillis = 0;
long getFromNextionTimer = 0;
union{
  unsigned long getDataLong;
  byte getDataByteArray[4];
} getDataUnion;

void setup(){
  Serial.begin(9600);     //Serial is the USB cable Serial Monitor connection to computer
  Serial1.begin(2400);    //Serial1 is pin 18 (Tx) & 19 (Rx) from the battery monitor
  Serial2.begin(9600);    //Serial2 is pin 16 (Tx) & 17 (Rx) To/From the Nextion Display

  String stage = "getRequest";
  char character = "";
  String data_from_display = "";
  watchDog = millis();
  

  emonGrid.voltage(0, 121.00, 1.7);  //input pin A0, Voltage Calib Factor, Phase Calib Factor
  emonInverter.voltage(1, 139.00, 1.7); //input pin A1, Voltage Calib Factor, Phase Calib Factor 
  emonGrid.current(2, 10);     //input pin A2, calibration
  emonInverter.current(3, 10); //input pin A3, calibration     

  pinMode(spVoltReadPin,INPUT);   //Analog Input pin A4, Solar Panel Output Voltage
  pinMode(loadTransfer, OUTPUT);  //pin 4
  pinMode(invPower, OUTPUT);      //pin 5  
  pinMode(invOnInd, INPUT);       //pin 6 
  pinMode(chSel, OUTPUT);         //pin 53   
  
  countpctOn = 0;  
  countpctOff = 0; 

  Serial.print("Initializing the SD card...");
  SD.begin(chSel);
  if (!SD.begin(chSel)) {      
    Serial.println("Card failed, or not present");   
    while(1);   
  }
  Serial.println("Card Initialized.");
  
  if (! rtc.begin()) {                             
      Serial.println("Couldn't find RTC");        
      while (1);                                  
    }
    if (rtc.lostPower()) {
      Serial.println("RTC lost power, lets set the time!");
    }
    //rtc.adjust(DateTime(YYYY, MM, D, hh, mm, s));
    //rtc.adjust(DateTime(2020, 11, 7, 14, 37, 0));   //To set the Date/Time, remove comment //, and enter in the data, upload it to Arduino, then insert the comment (//) again, and upload to Arduino again.

  
     
  Serial.println("Sketch version: ATS-EMON-Nextion_" + VERSION_NUMBER);     
  Serial.println("Day, Date, Time, Temp C, Temp F, Battery %, Watts, Days Since Charged, Days Since Equalized (PowerUp), Battery Voltage, Filtered Battery Voltage, Amps, Filtered Amps, Amp-Hours, Solar Panel Volts, Inverter Status, Inverter On Indicator Status, Load Transfer Status, On Setpoint, Off Setpoint, Grid Real Power, Grid Apparent Power, Grid Vrms, Grid Irms, Grid Power Factor, Inverter Real Power, Inverter Apparent Power, Inverter Vrms, Inverter Irms, Inverter Power Factor"); 
}

void loop(){
  
  while(!Serial1.available()){}

  if(millis() < getRequestMillis + 2000) {        
    getRequestMillis = 0;
 }

// if(millis() > getFromNextionTimer){
//  getFromNextionTimer = millis() + 10000;
  
  
 //}

  
  char a = Serial1.read();

  
  
  if(a =='%') { 
    //Serial.println();
      turnOnPointTemp = int(GetFromNextion("0"));
      turnOffPointTemp = int(GetFromNextion("1"));

      //Handles bad data from Nextion when changing set points
      if((turnOnPoint == -1 && turnOffPoint == -1 ) || (turnOnPointTemp > turnOffPointTemp)){
        turnOnPoint = turnOnPointTemp;
        turnOffPoint = turnOffPointTemp;
      }
      if(turnOnPointTemp < turnOffPointTemp){
        turnOnPoint = turnOffPointTemp;
        turnOffPoint = turnOnPointTemp;
      }
      
      char onOff[50];
      sprintf(onOff, "Turn on Point: %d, Turn off Point: %d", turnOnPoint, turnOffPoint);
      //Serial.print(onOff);  
      ToggleHardware("%");

//Read and Calculate the Solar Panel Voltage

spReadVal = analogRead(spVoltReadPin);    //Arduino's interpreted value,0 to 1023
panelVolt = (45./1023.)*spReadVal;      //Calculate the actual voltage
      
      myFile = SD.open("data1.txt",FILE_WRITE);
      if (myFile) {
        
        PrintClock();
        
        //Print Battery Monitor Data to the Serial Monitor
        PrintBatteryMonitorData("%", strData, 15);
        PrintBatteryMonitorData("W",strData,15);
        PrintBatteryMonitorData("DSC",strData,15);
        PrintBatteryMonitorData("DSE",strData,15);
        PrintBatteryMonitorData("V",strData,15);
        PrintBatteryMonitorData("FV",strData,15);
        PrintBatteryMonitorData("A",strData,15);
        PrintBatteryMonitorData("FA",strData,15);
        PrintBatteryMonitorData("AH",strData,15);

        //float batteryPercent = ReturnValue("%", strData) //do this for each of the above items to set variables from battery monitor
        PrintEmonToNextion("page0.t0.txt=\"",String(ReturnValue("%", strData))); //send variable to nextion
        PrintEmonToNextion("page0.t1.txt=\"",String(ReturnValue("AH", strData)));
        PrintEmonToNextion("page0.t2.txt=\"",String(ReturnValue("W", strData)));
        PrintEmonToNextion("page0.t3.txt=\"",String(ReturnValue("A", strData)));
        PrintEmonToNextion("page0.t4.txt=\"",String(ReturnValue("V", strData)));
        
        PrintConstants();  
        PrintEnergyMonitorData();

//Print to the Nextion    //See line 285 for printing Day, Date, Time, Temp to Nextion
        //PrintEmonToNextion("page0.g0.txt=\"", dtString);
        if(loadTransferToggle == "LOW") {
          gridStatus = "HIGH";}
          else if(loadTransferToggle == "HIGH") {
            gridStatus = "LOW";}
        PrintEmonToNextion("page2.t0.txt=\"",gridStatus);
        PrintEmonToNextion("page2.t1.txt=\"", String(emonGrid.Vrms));
        PrintEmonToNextion("page2.t2.txt=\"", String(emonGrid.Irms));
        PrintEmonToNextion("page2.t3.txt=\"", String(emonGrid.realPower));
        PrintEmonToNextion("page2.t4.txt=\"", String(emonGrid.apparentPower));
        PrintEmonToNextion("page2.t5.txt=\"", String(emonGrid.powerFactor));
        PrintEmonToNextion("page2.t6.txt=\"", String(loadTransferToggle));
        PrintEmonToNextion("page2.t7.txt=\"", String(emonInverter.Vrms));
        PrintEmonToNextion("page2.t8.txt=\"", String(emonInverter.Irms));
        PrintEmonToNextion("page2.t9.txt=\"", String(emonInverter.realPower));
        PrintEmonToNextion("page2.t10.txt=\"", String(emonInverter.apparentPower));
        PrintEmonToNextion("page2.t11.txt=\"", String(emonInverter.powerFactor));
        
//End print to Nextion
        
        myFile.close();

        delay(100);
        strData = "";
      }
      else {
        Serial.print("Error Opening data1.txt");
      }   
  }
  strData += a;         //strDataConcatenate all data into 'strData'
}

float ReturnValue(String searchStr, String strData){
  //Search strData for searchStr and return value of searchStr
  String strValue;
  strValue = strData.substring(strData.indexOf(","+searchStr+"=")+searchStr.length()+2,strData.indexOf(",",strData.indexOf(searchStr)));
  //Find value of following searchStr
  return strValue.toFloat();
}

void ToggleHardware(String controller){
  //turn on or off transfer switch and inverter depending on battery %
  if(ReturnValue(controller, strData)>turnOffPoint) { 
        if (digitalRead(invPower)==HIGH && digitalRead(loadTransfer)==HIGH && digitalRead(invOnInd)==LOW) {      //If invPower Pin 5 Output is High and loadTransfer Pin 4 Output is High and the invOnInd Pin 6 Input is Low, This would indicate an Inverter shut down scenario
          if(countpctOff>=toggleDelay){
            digitalWrite(loadTransfer,LOW);        
            loadTransferToggle = "LOW";          
            digitalWrite(invPower, LOW);
            inverterToggle = "LOW";
          }
          countpctOff++;
          countpctOn=0;
        }

        if(ReturnValue(controller, strData)>=turnOnPoint){    
          if(countpctOn>=toggleDelay){                
            digitalWrite(invPower,HIGH);              
            inverterToggle = "HIGH";
          }
          if(digitalRead(invOnInd)==HIGH){              
            digitalWrite(loadTransfer,HIGH);            
            loadTransferToggle = "HIGH";                
          }
          countpctOn++;
          countpctOff=0;
        }
      }
      else{
        if(countpctOff>=toggleDelay){                   
          digitalWrite(loadTransfer,LOW);               
          loadTransferToggle = "LOW";
          digitalWrite(invPower, LOW);                  
          inverterToggle = "LOW";
        }
        countpctOff++;
        countpctOn=0;
      }
}

void PrintClock(){
  //Print datetime and temperature to screen and save to file

//String dateString = 
  char dtString[50];
  char dtCString[50]; 
  
  Serial.println();
  DateTime now = rtc.now();
  int tempF = rtc.getTemperature() * 1.8 + 32;
  int tempC = rtc.getTemperature(); 

  sprintf(dtString,"%s %02d/%02d/%02d %02d:%02d:%02d %02d F ", daysOfTheWeek[now.dayOfTheWeek()], now.month(), now.day(), now.year(), now.hour(), now.minute(), now.second(), tempF);
  sprintf(dtCString,"%s %02d/%02d/%02d %02d:%02d:%02d %02d°C %02d°F ", daysOfTheWeek[now.dayOfTheWeek()], now.month(), now.day(), now.year(), now.hour(), now.minute(), now.second(), tempC, tempF);
  
  //sprintf(dtString,"%s %02d:%02d:%02d %02d/%02d/%02d %02d F ",daysOfTheWeek[now.dayOfTheWeek()], now.hour(), now.minute(), now.second(), now.day(), now.month(), now.year(), tempF);
  //sprintf(dtCString,"%s %02d:%02d:%02d %02d/%02d/%02d %02d°C %02d°F ",daysOfTheWeek[now.dayOfTheWeek()], now.hour(), now.minute(), now.second(), now.day(), now.month(), now.year(), tempC, tempF);
  //Serial.print(F("Date/Time: "));
  Serial.print(dtCString);

//Print Day, Date, Time, Temp to Nextion Scrolling Text on page 0. See line 186 for the rest of Printing to Nextion
  
  PrintEmonToNextion("page0.g0.txt=\"", dtString);                  //Not Working
  
  myFile.println();
  myFile.print(dtCString);          //Print to microSD card
}

void PrintBatteryMonitorData(String searchStr, String strData, int wait){
  //Print battery monitor data to screen and save to file
  Serial.print(ReturnValue(searchStr,strData)); 
  Serial.print(",");
  myFile.print(ReturnValue(searchStr,strData));
  myFile.print(",");
  delay(wait);
}

void PrintConstants(){
  //Print constants to screen and save to file
  Serial.print(panelVolt);      //Print the Solar Panel Voltage to the Serial Monitor
  Serial.print(",");
  Serial.print(" ");
  Serial.print(inverterToggle);
  Serial.print(",");
  Serial.print(digitalRead(invOnInd));
  Serial.print(",");
  Serial.print(loadTransferToggle);
  Serial.print(",");
  Serial.print(turnOnPoint);
  Serial.print(","); 
  Serial.print(turnOffPoint);
  Serial.print(",");

  myFile.print(panelVolt);           //Print the Solar Panel Voltage to the microSD card
  myFile.print(",");
  myFile.print(inverterToggle);
  myFile.print(",");
  myFile.print(digitalRead(invOnInd));
  myFile.print(",");
  myFile.print(loadTransferToggle);
  myFile.print(",");
  myFile.print(turnOnPoint);
  myFile.print(",");
  myFile.print(turnOffPoint);
  myFile.print(",");
  
  delay(10);  
}

void PrintEnergyMonitorData(){
  //Print energy monitor data to screen and save to file
  emonGrid.calcVI(20,2000);       
  emonInverter.calcVI(20,2000);      
  emonGrid.serialprint();         
  emonInverter.serialprint();
  
  myFile.print(emonGrid.realPower);
  myFile.print(",");
  myFile.print(emonGrid.apparentPower);
  myFile.print(",");
  myFile.print(emonGrid.Vrms);
  myFile.print(",");
  myFile.print(emonGrid.Irms);
  myFile.print(",");
  myFile.print(emonGrid.powerFactor);
  myFile.print(",");
  myFile.print(emonInverter.realPower);
  myFile.print(",");
  myFile.print(emonInverter.apparentPower);
  myFile.print(",");
  myFile.print(emonInverter.Vrms);
  myFile.print(",");
  myFile.print(emonInverter.Irms);
  myFile.print(",");
  myFile.print(emonInverter.powerFactor);  
}

void PrintEmonToNextion(String address, String myNextionString) {
  Serial2.print(address);
  Serial2.print(myNextionString);
  Serial2.print("\"");
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);
  delay(10);
}


long GetFromNextion(String dataName){
  long returnVal = -1;

  while(returnVal == -1) {
  if(stage == "getRequest") {
    if(millis() > getRequestMillis + 100) {
      Serial2.print("get page0.n" + dataName + ".val");
      Serial2.write(0xff);
      Serial2.write(0xff);
      Serial2.write(0xff);
      stage = "getReply";
      watchDog = millis();
      getRequestMillis = millis();
    }
  }
    if(stage == "getReply") {
      if(Serial2.available()) {
        character = char(Serial2.read());
        data_from_display += character;
      }      
      
      if(data_from_display.endsWith(endChar)) {
        
          if(data_from_display.substring(0, 1) == "q") {
            for(int x = 0; x < 4; x++) {              
              getDataUnion.getDataByteArray[x] = data_from_display[x + 1];
              returnVal = getDataUnion.getDataLong;
              //Serial.println("---------------- = " + String(getDataUnion.getDataLong));
              //Serial.println();
            }
          }
                   
          getDataUnion.getDataLong = 0;
          data_from_display = "";
          stage = "getRequest";
          watchDog = millis();
      }
//      if(millis() > watchDog + 1000) {
//      stage = "getRequest";
//      watchDog = millis();
//   }
   }
//   else{
//      if(Serial2.available()) {
//        data_from_display="";
//        delay(30);
//        while(Serial2.available()) {
//          data_from_display += char(Serial2.read());
//        }
//        //Serial.println(data_from_display);
//        data_from_display = "";
//      }
//   }
   
  }
  delay(30);
  return returnVal;
}

My encounter with weird data showing up came when I switched from a Mega to a Due. My solution can be seen is the following code:

void fReceiveSerial_LIDAR( void * parameters  )
{
  bool BeginSentence = false;
  char OneChar;
  char *str;
  str = (char *)ps_calloc(300, sizeof(char) ); // put str buffer into PSRAM
  // log_i("Free PSRAM before String: %d", ESP.getFreePsram());
  for ( ;; )
  {
    EventBits_t xbit = xEventGroupWaitBits (eg, evtReceiveSerial_LIDAR, pdTRUE, pdTRUE, portMAX_DELAY);
    if ( LIDARSerial.available() >= 1 )
    {
      while ( LIDARSerial.available() )
      {
        OneChar = LIDARSerial.read();
        if ( BeginSentence )
        {
          if ( OneChar == '>')
          {
            if ( xSemaphoreTake( sema_ParseLIDAR_ReceivedSerial, xSemaphoreTicksToWait10 ) == pdTRUE )
            {
               xQueueOverwrite( xQ_LIDAR_Display_INFO, ( void * ) &str );
              xEventGroupSetBits( eg, evtParseLIDAR_ReceivedSerial );
              //
            }
            BeginSentence = false;
            break;
          }
          strncat( str, &OneChar, 1 );
        }
        else
        {
          if ( OneChar == '<' )
          {
            strcpy( str, ""); // clear string buffer
            BeginSentence = true; // found beginning of sentence
          }
        }
      } //  while ( LIDARSerial.available() )
    } //if ( LIDARSerial.available() >= 1 )
    xSemaphoreGive( sema_ReceiveSerial_LIDAR );
    //        log_i( "fReceiveSerial_LIDAR " );
    //        log_i(uxTaskGetStackHighWaterMark( NULL ));
  }
  free(str);
  vTaskDelete( NULL );
} //void fParseSerial( void * parameters  

I changed if ( LIDARSerial.available() > 0 ) to if ( LIDARSerial.available() >= 1 ) . I have been using this model since my use of the Due with the STM32 Blue Pill and the ESP32. Perhaps it may offer a solution to your issue?

jremington, You requested that I send up a data sample. I do save this data to a microSD card then open them with Notepad.txt files. Apparently this forum won't allow me to upload a sampling of a text file that I put together for demonstration purposes. I did however upload my whole sketch. And as I mentioned in my first post all of the other data come in fine. It's only the Battery Current that is right sometimes. but not repeatable enough for me to fully trust. I'm not sure how to get a .txt document into one of the formats that Arduino.cc will except. Thanks for any comments you may have to add.

just paste the text as if it was code (in code tags) directly in line

Idahowalker, Thank you for this little tid-bit from your experience. I will give your suggestion a try.

Thanks jremmington. Well, I can say that the value returned is always a number. I get a data sample every 4 to 5 seconds. For example I'll get a consistent 3.00 for 10 samplings, then I'll get 12.58, which coincidently is what the Battery Voltage is. Then it will go back to 3.14 for several rows of returns, then out of the blue get something like 342.78, that don't coincide with anything else that I receive from this Battery Monitor. Then it will return to Current samplings that look like they are within the range that I would expect somewhere between 20.00 amp positive going into the batteries while charging, to -30.0 at the most that the Inverter might pull out very rarely. I have suspected that the Battery Monitor is to blame, but I don't want to discount the possibility that it's my doing all along, or not.

J-M-L Jackson, I'll give that a try.

Day Date Time TempC TempF Battery% Watts DSC DSE BatVolts  BatAvgVolts BatCurrent BatAvgCurrent Amp-HrsFromFull SolarPanelVoltage InvPower InvOnInd LoadTransfer OnStPt OffSetPt GridRealPower Grid AppPower GridVrms GridIrms GridPwrFactor InvRealPower InvAppPower InvVrms InvIrms invPwrFactor
Wednesday 6/2/2021 15:34:59 25.50 77.90 93.00,72.80,3.89,211.00,12.70,12.60,0.00,-2.90,-28.70,31.76,LOW,0,LOW,95,92,334.50,382.26,137.11,2.79,0.88,4.94,7.01,5.18,1.35,0.71
Wednesday 6/2/2021 15:35:3 25.50 77.90 93.00,73.70,3.89,211.00,12.70,12.60,5.00,-2.70,-28.70,31.54,LOW,0,LOW,95,92,336.58,384.73,136.29,2.82,0.87,4.82,5.76,4.24,1.36,0.84
Wednesday 6/2/2021 15:35:6 25.50 77.90 93.00,73.80,3.89,211.00,12.70,12.60,5.00,-2.50,-28.70,31.63,LOW,0,LOW,95,92,316.76,366.64,137.13,2.67,0.86,5.81,8.07,5.97,1.35,0.72
Wednesday 6/2/2021 15:35:9 25.50 77.90 93.00,74.00,3.89,211.00,12.70,12.60,5.00,-2.40,-28.60,31.36,LOW,0,LOW,95,92,335.80,383.25,137.18,2.79,0.88,5.27,6.27,4.45,1.41,0.84
Wednesday 6/2/2021 15:35:12 25.50 77.90 93.00,74.20,3.89,211.00,12.70,12.60,5.00,-2.20,-28.60,28.46,LOW,0,LOW,95,92,315.91,365.63,136.49,2.68,0.86,5.42,7.28,5.37,1.36,0.74
Wednesday 6/2/2021 15:35:16 25.50 77.90 93.00,71.90,3.89,211.00,12.70,12.60,52.00,-2.00,-28.60,30.70,LOW,0,LOW,95,92,332.03,376.93,137.22,2.75,0.88,5.46,6.30,4.60,1.37,0.87
Wednesday 6/2/2021 15:35:19 25.50 77.90 93.00,72.60,3.90,211.00,12.70,12.60,5.00,-1.90,-28.60,30.70,LOW,0,LOW,95,92,322.64,372.44,137.15,2.72,0.87,4.75,6.54,4.98,1.31,0.73
Wednesday 6/2/2021 15:35:22 25.50 77.90 93.00,73.30,3.90,211.00,12.80,12.60,5.00,-1.70,-28.60,28.90,LOW,0,LOW,95,92,327.54,375.15,137.73,2.72,0.87,5.22,6.26,4.72,1.33,0.83
Wednesday 6/2/2021 15:35:26 25.50 77.90 93.00,72.40,3.90,211.00,12.80,12.60,5.00,-1.60,-28.60,30.66,LOW,0,LOW,95,92,335.11,388.83,136.30,2.85,0.86,4.84,7.28,5.48,1.33,0.66
Wednesday 6/2/2021 15:35:29 25.50 77.90 93.00,72.70,3.90,211.00,12.80,12.60,5.00,-1.40,-28.60,31.14,LOW,0,LOW,95,92,305.88,357.98,137.09,2.61,0.85,4.73,5.79,4.17,1.39,0.82
Wednesday 6/2/2021 15:35:32 25.50 77.90 93.00,74.40,3.90,211.00,12.80,12.60,5.00,-1.30,-28.60,31.32,LOW,0,LOW,95,92,325.06,368.26,136.72,2.69,0.88,4.87,6.13,4.51,1.36,0.79
Wednesday 6/2/2021 15:35:36 25.50 77.90 93.00,74.80,3.90,211.00,12.80,12.60,5.00,-1.10,-28.60,31.54,LOW,0,LOW,95,92,334.21,377.48,136.76,2.76,0.89,6.04,8.47,6.31,1.34,0.71
Wednesday 6/2/2021 15:35:39 25.50 77.90 93.00,75.00,3.90,211.00,12.80,12.60,5.00,-1.00,-28.60,31.72,LOW,0,LOW,95,92,331.63,381.44,136.93,2.79,0.87,5.82,10.91,8.10,1.35,0.53
Wednesday 6/2/2021 15:35:42 25.50 77.90 93.00,75.30,3.90,211.00,12.80,12.60,5.00,-0.90,-28.60,32.07,LOW,0,LOW,95,92,338.33,395.59,137.06,2.89,0.86,5.49,6.68,4.80,1.39,0.82
Wednesday 6/2/2021 15:35:46 25.50 77.90 93.00,75.40,3.90,211.00,12.80,12.60,5.00,-0.70,-28.60,32.24,LOW,0,LOW,95,92,328.02,376.55,137.28,2.74,0.87,5.68,7.76,5.56,1.40,0.73
Wednesday 6/2/2021 15:35:49 25.50 77.90 93.00,75.40,3.90,211.00,12.80,12.60,5.00,-0.60,-28.60,30.75,LOW,0,LOW,95,92,330.16,375.82,136.95,2.74,0.88,5.56,6.71,4.62,1.45,0.83
Wednesday 6/2/2021 15:35:52 25.50 77.90 93.00,75.40,3.90,211.00,12.80,12.60,5.00,-0.50,-28.60,30.48,LOW,0,LOW,95,92,337.79,385.78,137.37,2.81,0.88,5.42,7.00,4.98,1.41,0.77
Wednesday 6/2/2021 15:35:55 25.50 77.90 93.00,74.40,3.90,211.00,12.80,12.60,5.00,-0.30,-28.60,30.53,LOW,0,LOW,95,92,311.65,373.45,136.78,2.73,0.83,5.29,6.49,4.66,1.39,0.81
Wednesday 6/2/2021 15:35:59 25.50 77.90 93.00,74.50,3.90,211.00,12.80,12.60,5.00,-0.20,-28.60,30.22,LOW,0,LOW,95,92,332.01,385.24,137.01,2.81,0.86,5.24,6.22,4.57,1.36,0.84
Wednesday 6/2/2021 15:36:2 25.50 77.90 93.00,73.60,3.90,211.00,12.80,12.60,5.00,-0.10,-28.60,29.87,LOW,0,LOW,95,92,319.80,374.72,136.81,2.74,0.85,5.04,5.90,4.26,1.38,0.85
Wednesday 6/2/2021 15:36:5 25.50 77.90 93.00,74.10,3.90,211.00,12.80,12.60,5.00,0.00,-28.60,31.58,LOW,0,LOW,95,92,319.12,372.96,137.30,2.72,0.86,4.81,7.79,5.70,1.37,0.62
Wednesday 6/2/2021 15:36:9 25.50 77.90 93.00,75.00,3.90,211.00,12.80,12.60,528.00,0.10,-28.60,31.54,LOW,0,LOW,95,92,332.48,376.23,136.78,2.75,0.88,3.84,6.75,4.95,1.36,0.57
Wednesday 6/2/2021 15:36:12 25.50 77.90 93.00,75.80,3.90,211.00,12.80,12.60,5.00,0.30,-28.60,31.50,LOW,0,LOW,95,92,322.00,376.03,137.16,2.74,0.86,5.56,6.72,4.88,1.38,0.83
Wednesday 6/2/2021 15:36:15 25.50 77.90 93.00,76.00,3.90,211.00,12.80,12.70,512.80,0.40,-28.50,33.30,LOW,0,LOW,95,92,319.36,366.44,136.56,2.68,0.87,4.22,6.35,4.78,1.33,0.66
Wednesday 6/2/2021 15:36:18 25.50 77.90 93.00,76.00,3.90,211.00,12.80,12.70,6.00,0.50,-28.50,33.08,LOW,0,LOW,95,92,334.15,376.71,136.01,2.77,0.89,4.63,10.47,7.38,1.42,0.44
Wednesday 6/2/2021 15:36:22 25.50 77.90 93.00,76.20,3.90,211.00,12.80,12.70,6.00,0.60,-28.50,30.44,LOW,0,LOW,95,92,319.62,361.48,137.14,2.64,0.88,5.18,6.87,4.91,1.40,0.75
Wednesday 6/2/2021 15:36:25 25.50 77.90 93.00,75.60,3.90,211.00,12.80,12.70,5.00,0.70,-28.50,31.28,LOW,0,LOW,95,92,331.96,373.28,136.88,2.73,0.89,5.04,6.82,4.88,1.40,0.74
Wednesday 6/2/2021 15:36:28 25.50 77.90 93.00,75.30,3.90,211.00,12.80,12.70,5.00,0.80,-28.50,31.14,LOW,0,LOW,95,92,329.58,385.80,136.81,2.82,0.85,5.00,7.23,5.27,1.37,0.69
Wednesday 6/2/2021 15:36:32 25.50 77.90 93.00,76.30,3.90,211.00,12.80,12.70,6.00,0.90,-28.50,31.14,LOW,0,LOW,95,92,323.52,379.51,137.25,2.77,0.85,4.54,6.37,4.77,1.34,0.71
Wednesday 6/2/2021 15:36:35 25.50 77.90 93.00,76.40,3.90,211.00,12.80,12.70,6.00,1.00,-28.50,31.45,LOW,0,LOW,95,92,331.40,375.98,137.42,2.74,0.88,5.48,7.46,5.21,1.43,0.73
Wednesday 6/2/2021 15:36:38 25.50 77.90 93.00,76.70,3.90,211.00,12.80,12.70,6.00,1.10,-28.50,29.56,LOW,0,LOW,95,92,330.52,381.81,136.93,2.79,0.87,5.76,7.54,5.52,1.37,0.76
Wednesday 6/2/2021 15:36:41 25.50 77.90 93.00,76.20,3.90,211.00,12.80,12.70,5.00,1.20,-28.50,29.78,LOW,0,LOW,95,92,325.57,369.16,137.19,2.69,0.88,4.70,7.59,5.15,1.47,0.62
Wednesday 6/2/2021 15:36:45 25.50 77.90 93.00,75.50,3.90,211.00,12.80,12.70,5.00,1.30,-28.50,30.22,LOW,0,LOW,95,92,332.82,383.71,136.87,2.80,0.87,5.34,6.74,4.85,1.39,0.79
Wednesday 6/2/2021 15:36:48 25.50 77.90 93.00,75.40,3.90,211.00,12.80,12.70,512.80,1.40,-28.50,30.13,LOW,0,LOW,95,92,339.80,382.14,136.31,2.80,0.89,5.51,6.62,4.92,1.35,0.83
Wednesday 6/2/2021 15:36:51 25.50 77.90 93.00,75.10,3.90,211.00,12.80,12.70,512.80,1.50,-28.50,30.31,LOW,0,LOW,95,92,320.71,377.96,137.06,2.76,0.85,4.55,6.56,5.05,1.30,0.69
Wednesday 6/2/2021 15:36:54 25.50 77.90 93.00,75.30,3.90,211.00,12.80,12.70,5.00,1.60,-28.50,30.44,LOW,0,LOW,95,92,316.55,380.57,137.39,2.77,0.83,4.74,6.71,4.89,1.37,0.71
Wednesday 6/2/2021 15:36:58 25.50 77.90 93.00,75.30,3.90,211.00,12.80,12.70,58.00,1.70,-28.50,30.53,LOW,0,LOW,95,92,296.60,365.91,137.02,2.67,0.81,5.08,6.39,4.68,1.37,0.79
Wednesday 6/2/2021 15:37:1 25.50 77.90 93.00,75.30,3.90,211.00,12.80,12.70,5.00,1.70,-28.50,30.66,LOW,0,LOW,95,92,319.84,368.72,136.19,2.71,0.87,5.41,6.77,4.84,1.40,0.80
Wednesday 6/2/2021 15:37:4 25.50 77.90 93.00,75.40,3.90,211.00,12.80,12.70,52.80,1.80,-28.50,30.40,LOW,0,LOW,95,92,327.62,376.77,137.21,2.75,0.87,5.66,8.00,5.79,1.38,0.71
Wednesday 6/2/2021 15:37:8 25.50 77.90 93.00,75.50,3.90,211.00,12.80,12.70,5.00,1.90,-28.50,30.26,LOW,0,LOW,95,92,322.13,362.50,136.72,2.65,0.89,5.50,6.59,4.65,1.42,0.84
Wednesday 6/2/2021 15:37:11 25.50 77.90 93.00,75.50,3.90,211.00,12.80,12.70,5.00,2.00,-28.50,32.02,LOW,0,LOW,95,92,328.62,371.80,136.93,2.72,0.88,5.49,6.34,4.71,1.35,0.87
Wednesday 6/2/2021 15:37:14 25.50 77.90 93.00,76.30,3.90,211.00,12.80,12.70,6.00,2.10,-28.50,32.82,LOW,0,LOW,95,92,333.30,389.20,136.36,2.85,0.86,5.39,7.36,5.23,1.41,0.73
Wednesday 6/2/2021 15:37:17 25.50 77.90 93.00,76.90,3.90,211.00,12.80,12.70,612.80,2.10,-28.40,32.68,LOW,0,LOW,95,92,330.15,377.85,136.48,2.77,0.87,4.29,7.03,5.16,1.36,0.61
Wednesday 6/2/2021 15:37:21 25.50 77.90 93.00,76.90,3.90,211.00,12.80,12.70,6.00,2.20,-28.40,28.46,LOW,0,LOW,95,92,331.07,375.12,137.06,2.74,0.88,5.47,6.80,5.04,1.35,0.80
Wednesday 6/2/2021 15:37:24 25.50 77.90 93.00,76.00,3.90,211.00,12.80,12.70,5.00,2.30,-28.40,28.59,LOW,0,LOW,95,92,328.19,374.99,136.53,2.75,0.88,5.06,6.99,5.23,1.34,0.72
Wednesday 6/2/2021 15:37:27 25.50 77.90 93.00,74.00,3.90,211.00,12.80,12.70,52.80,2.40,-28.40,32.24,LOW,0,LOW,95,92,323.54,380.59,136.90,2.78,0.85,5.57,6.58,4.77,1.38,0.85
Wednesday 6/2/2021 15:37:30 25.50 77.90 93.00,75.50,3.90,211.00,12.80,12.70,5.00,2.40,-28.40,32.68,LOW,0,LOW,95,92,330.12,378.93,136.74,2.77,0.87,4.95,8.31,6.12,1.36,0.60
Wednesday 6/2/2021 15:37:34 25.50 77.90 93.00,76.70,3.90,211.00,12.80,12.70,6.00,2.50,-28.40,30.79,LOW,0,LOW,95,92,329.86,375.95,136.85,2.75,0.88,5.15,6.09,4.32,1.41,0.85
Wednesday 6/2/2021 15:37:37 25.50 77.90 93.00,76.00,3.90,211.00,12.80,12.70,6.00,2.60,-28.40,32.73,LOW,0,LOW,95,92,322.18,371.49,136.79,2.72,0.87,5.16,6.42,4.59,1.40,0.80
Wednesday 6/2/2021 15:37:40 25.50 77.90 93.00,76.40,3.90,211.00,12.80,12.70,6.00,2.60,-28.40,34.27,LOW,0,LOW,95,92,315.46,367.51,137.64,2.67,0.86,5.89,6.80,4.83,1.41,0.87
Wednesday 6/2/2021 15:37:44 25.50 77.90 93.00,76.70,3.90,211.00,12.80,12.70,6.00,2.70,-28.40,30.48,LOW,0,LOW,95,92,338.35,391.63,136.97,2.86,0.86,5.02,5.74,4.27,1.34,0.87
Wednesday 6/2/2021 15:37:47 25.50 77.90 93.00,76.70,3.90,211.00,12.80,12.70,6.00,2.80,-28.40,30.48,LOW,0,LOW,95,92,328.50,379.33,135.76,2.79,0.87,5.20,6.34,4.50,1.41,0.82
Wednesday 6/2/2021 15:37:50 25.50 77.90 93.00,76.40,3.90,211.00,12.80,12.70,62.80,2.80,-28.40,30.31,LOW,0,LOW,95,92,326.46,371.67,136.40,2.72,0.88,4.96,6.54,4.93,1.33,0.76
Wednesday 6/2/2021 15:37:53 25.50 77.90 93.00,76.40,3.90,211.00,12.80,12.70,6.00,2.90,-28.40,30.09,LOW,0,LOW,95,92,340.66,401.79,136.49,2.94,0.85,5.98,7.20,4.92,1.46,0.83
Wednesday 6/2/2021 15:37:57 25.50 77.90 93.00,76.30,3.90,211.00,12.80,12.70,6.00,3.00,-28.40,30.09,LOW,0,LOW,95,92,330.49,379.86,136.96,2.77,0.87,4.17,6.23,4.47,1.39,0.67
Wednesday 6/2/2021 15:38:0 25.50 77.90 93.00,76.30,3.90,211.00,12.80,12.70,6.00,3.00,-28.40,30.09,LOW,0,LOW,95,92,321.91,371.62,137.02,2.71,0.87,5.30,7.04,5.04,1.40,0.75
Wednesday 6/2/2021 15:38:3 25.50 77.90 93.00,76.20,3.90,211.00,12.80,12.70,5.00,3.10,-28.40,28.68,LOW,0,LOW,95,92,331.55,379.89,136.63,2.78,0.87,5.13,6.19,4.59,1.35,0.83
Wednesday 6/2/2021 15:38:6 25.50 77.90 93.00,74.40,3.90,211.00,12.80,12.70,5.00,3.10,-28.40,30.84,LOW,0,LOW,95,92,322.52,377.17,137.13,2.75,0.86,4.83,7.65,5.66,1.35,0.63
Wednesday 6/2/2021 15:38:10 25.50 77.90 93.00,74.80,3.90,211.00,12.80,12.70,5.00,3.20,-28.40,28.81,LOW,0,LOW,95,92,329.32,373.30,136.73,2.73,0.88,5.22,6.57,4.69,1.40,0.79
Wednesday 6/2/2021 15:38:13 25.50 77.90 93.00,73.20,3.90,211.00,12.80,12.70,512.80,3.20,-28.40,32.77,LOW,0,LOW,95,92,337.93,384.64,136.29,2.82,0.88,4.97,6.68,4.87,1.37,0.74
Wednesday 6/2/2021 15:38:16 25.50 77.90 93.00,75.40,3.90,211.00,12.80,12.70,5.00,3.30,-28.40,32.90,LOW,0,LOW,95,92,327.95,376.40,136.52,2.76,0.87,5.03,7.24,5.37,1.35,0.69
Wednesday 6/2/2021 15:38:20 25.50 77.90 93.00,76.30,3.90,211.00,12.80,12.70,6.00,3.30,-28.40,30.97,LOW,0,LOW,95,92,322.28,371.70,136.20,2.73,0.87,4.96,6.70,4.85,1.38,0.74
Wednesday 6/2/2021 15:38:23 25.50 77.90 93.00,76.00,3.90,211.00,12.80,12.70,512.80,3.40,-28.30,29.08,LOW,0,LOW,95,92,326.17,372.01,136.91,2.72,0.88,4.11,5.88,4.42,1.33,0.70
Wednesday 6/2/2021 15:38:26 25.50 77.90 93.00,73.90,3.90,211.00,12.80,12.70,5.00,3.40,-28.30,29.03,LOW,0,LOW,95,92,311.34,371.31,136.57,2.72,0.84,4.85,5.65,4.02,1.40,0.86
Wednesday 6/2/2021 15:38:29 25.50 77.90 93.00,73.20,3.90,211.00,12.80,12.70,5.00,3.50,-28.30,28.24,LOW,0,LOW,95,92,330.22,379.74,136.65,2.78,0.87,5.76,6.45,4.39,1.47,0.89
Wednesday 6/2/2021 15:38:33 25.50 77.90 93.00,73.00,3.90,211.00,12.80,12.70,5.00,3.50,-28.30,28.72,LOW,0,LOW,95,92,324.75,367.71,136.82,2.69,0.88,5.82,7.68,5.51,1.39,0.76
Wednesday 6/2/2021 15:38:36 25.25 77.45 93.00,73.10,3.90,211.00,12.80,12.70,5.00,3.60,-28.30,28.59,LOW,0,LOW,95,92,325.60,370.19,136.95,2.70,0.88,5.65,6.01,4.35,1.38,0.94
Wednesday 6/2/2021 15:38:39 25.25 77.45 93.00,73.10,3.90,211.00,12.80,12.70,5.00,3.60,-28.30,28.46,LOW,0,LOW,95,92,312.65,365.44,137.09,2.67,0.86,4.86,6.20,4.66,1.33,0.78
Wednesday 6/2/2021 15:38:42 25.25 77.45 93.00,72.70,3.90,211.00,12.80,12.70,5.00,3.70,-28.30,31.80,LOW,0,LOW,95,92,316.59,365.69,135.73,2.69,0.87,4.96,5.98,4.40,1.36,0.83
Wednesday 6/2/2021 15:38:46 25.25 77.45 93.00,74.40,3.90,211.00,12.80,12.70,52.80,3.70,-28.30,32.07,LOW,0,LOW,95,92,323.89,375.29,136.77,2.74,0.86,4.87,6.69,5.07,1.32,0.73
Wednesday 6/2/2021 15:38:49 25.25 77.45 93.00,75.50,3.90,211.00,12.80,12.70,5.80,3.70,-28.30,31.36,LOW,0,LOW,95,92,311.99,364.55,136.90,2.66,0.86,4.90,6.50,4.90,1.33,0.75
Wednesday 6/2/2021 15:38:53 25.25 77.45 93.00,75.60,3.90,211.00,12.80,12.70,505.90,3.80,-28.30,30.70,LOW,0,LOW,95,92,321.99,369.89,136.17,2.72,0.87,5.32,6.38,4.52,1.41,0.83
Wednesday 6/2/2021 15:38:57 25.25 77.45 93.00,74.80,3.90,211.00,12.80,12.70,5.00,3.80,-28.30,30.70,LOW,0,LOW,95,92,325.56,379.11,136.54,2.78,0.86,4.97,6.48,4.89,1.33,0.77
Wednesday 6/2/2021 15:39:0 25.25 77.45 93.00,74.00,3.90,211.00,12.80,12.70,512.80,3.90,-28.30,31.14,LOW,0,LOW,95,92,335.92,375.12,136.64,2.75,0.90,4.88,6.02,4.49,1.34,0.81
Wednesday 6/2/2021 15:39:3 25.25 77.45 93.00,73.70,3.90,211.00,12.80,12.70,5.00,3.90,-28.30,31.14,LOW,0,LOW,95,92,319.47,367.69,137.12,2.68,0.87,4.65,6.24,4.68,1.33,0.75
Wednesday 6/2/2021 15:39:6 25.25 77.45 93.00,73.90,3.90,211.00,12.80,12.70,52.80,4.00,-28.30,31.06,LOW,0,LOW,95,92,319.17,368.61,137.20,2.69,0.87,5.43,6.93,4.89,1.42,0.78
Wednesday 6/2/2021 15:39:10 25.25 77.45 93.00,73.90,3.90,211.00,12.80,12.70,0.00,4.00,-28.30,30.53,LOW,0,LOW,95,92,328.95,373.56,137.19,2.72,0.88,2.93,7.60,5.84,1.30,0.39
Wednesday 6/2/2021 15:39:13 25.25 77.45 93.00,73.90,3.90,211.00,12.80,12.80,5.00,4.00,-28.30,30.31,LOW,0,LOW,95,92,323.79,378.11,137.42,2.75,0.86,4.51,5.58,4.14,1.35,0.81
Wednesday 6/2/2021 15:39:16 25.25 77.45 93.00,73.60,3.90,211.00,12.80,12.80,5.00,4.10,-28.30,30.18,LOW,0,LOW,95,92,322.39,377.16,136.59,2.76,0.85,5.12,6.62,4.90,1.35,0.77
Wednesday 6/2/2021 15:39:20 25.25 77.45 93.00,74.00,3.90,211.00,12.80,12.80,5.90,4.10,-28.30,29.91,LOW,0,LOW,95,92,321.81,376.79,136.68,2.76,0.85,4.95,6.26,4.51,1.39,0.79
Wednesday 6/2/2021 15:39:23 25.25 77.45 93.00,73.90,3.90,211.00,12.90,12.80,5.00,4.10,-28.30,30.09,LOW,0,LOW,95,92,328.34,368.09,137.05,2.69,0.89,5.04,5.90,4.54,1.30,0.85
Wednesday 6/2/2021 15:39:26 25.25 77.45 93.00,73.70,3.90,211.00,12.90,12.80,5.90,4.20,-28.20,29.96,LOW,0,LOW,95,92,322.73,373.76,136.72,2.73,0.86,5.07,5.41,4.06,1.33,0.94
Wednesday 6/2/2021 15:39:29 25.25 77.45 93.00,73.50,3.90,211.00,12.90,12.80,5.00,4.20,-28.20,29.74,LOW,0,LOW,95,92,340.31,383.67,136.71,2.81,0.89,5.26,6.11,4.60,1.33,0.86
Wednesday 6/2/2021 15:39:33 25.25 77.45 93.00,73.40,3.90,211.00,12.90,12.80,5.00,4.20,-28.20,28.15,LOW,0,LOW,95,92,331.62,373.78,137.05,2.73,0.89,4.87,5.55,4.15,1.34,0.88
Wednesday 6/2/2021 15:39:36 25.25 77.45 93.00,72.50,3.90,211.00,12.90,12.80,512.90,4.20,-28.20,28.33,LOW,0,LOW,95,92,311.03,370.97,137.09,2.71,0.84,4.85,5.61,4.34,1.29,0.87
Wednesday 6/2/2021 15:39:39 25.25 77.45 93.00,70.00,3.90,211.00,12.90,12.80,52.90,4.30,-28.20,32.33,LOW,0,LOW,95,92,339.03,380.00,136.38,2.79,0.89,5.25,7.38,5.34,1.38,0.71
Wednesday 6/2/2021 15:39:42 25.25 77.45 93.00,73.30,3.90,211.00,12.90,12.80,5.00,4.30,-28.20,29.30,LOW,0,LOW,95,92,308.68,361.23,136.23,2.65,0.85,5.20,5.55,4.31,1.29,0.94
Wednesday 6/2/2021 15:39:46 25.25 77.45 93.00,74.00,3.90,211.00,12.90,12.80,5.00,4.30,-28.20,29.21,LOW,0,LOW,95,92,318.54,373.73,137.10,2.73,0.85,4.72,5.53,4.25,1.30,0.85
Wednesday 6/2/2021 15:39:49 25.25 77.45 93.00,72.90,3.90,211.00,12.90,12.80,5.90,4.40,-28.20,29.16,LOW,0,LOW,95,92,319.56,364.79,137.41,2.65,0.88,4.96,5.96,4.26,1.40,0.83
Wednesday 6/2/2021 15:39:52 25.25 77.45 93.00,72.90,3.90,211.00,12.90,12.80,512.90,4.40,-28.20,29.03,LOW,0,LOW,95,92,331.99,386.59,136.98,2.82,0.86,5.00,6.18,4.66,1.33,0.81
Wednesday 6/2/2021 15:39:58 25.25 77.45 93.00,72.90,3.90,211.00,12.90,12.80,590.00,4.40,-28.20,29.96,LOW,0,LOW,95,92,328.38,372.98,136.49,2.73,0.88,4.88,6.62,4.96,1.34,0.74
Wednesday 6/2/2021 15:40:1 25.25 77.45 93.00,72.40,3.90,211.00,12.90,12.80,5.00,4.40,-28.20,30.09,LOW,0,LOW,95,92,327.14,369.69,136.96,2.70,0.88,4.55,6.11,4.51,1.36,0.75
Wednesday 6/2/2021 15:40:4 25.25 77.45 93.00,72.00,3.90,211.00,12.90,12.80,512.90,4.50,-28.20,30.22,LOW,0,LOW,95,92,331.53,377.15,136.70,2.76,0.88,5.39,5.75,4.15,1.39,0.94
Wednesday 6/2/2021 15:40:7 25.25 77.45 93.00,71.90,3.90,211.00,12.90,12.80,5.00,4.50,-28.20,30.18,LOW,0,LOW,95,92,331.44,377.38,137.21,2.75,0.88,5.14,6.53,4.62,1.41,0.79
Wednesday 6/2/2021 15:40:11 25.25 77.45 93.00,71.70,3.90,211.00,12.90,12.80,5.00,4.50,-28.20,30.18,LOW,0,LOW,95,92,329.74,379.45,137.06,2.77,0.87,4.92,5.59,4.23,1.32,0.88
Wednesday 6/2/2021 15:40:14 25.25 77.45 93.00,71.70,3.90,211.00,12.90,12.80,5.00,4.50,-28.20,29.43,LOW,0,LOW,95,92,326.95,368.57,136.74,2.70,0.89,5.41,7.02,5.34,1.31,0.77
Wednesday 6/2/2021 15:40:17 25.25 77.45 93.00,71.30,3.90,211.00,12.90,12.80,5.00,4.60,-28.20,31.23,LOW,0,LOW,95,92,317.11,357.63,136.64,2.62,0.89,5.06,5.76,4.21,1.37,0.88
Wednesday 6/2/2021 15:40:21 25.25 77.45 93.00,73.00,3.90,211.00,12.90,12.80,0.00,4.60,-28.20,28.99,LOW,0,LOW,95,92,320.02,377.04,136.85,2.76,0.85,4.85,6.48,4.85,1.33,0.75
Wednesday 6/2/2021 15:40:24 25.25 77.45 93.00,72.50,3.90,211.00,12.90,12.80,5.00,4.60,-28.20,28.86,LOW,0,LOW,95,92,324.62,367.66,136.39,2.70,0.88,4.79,5.64,4.24,1.33,0.85
Wednesday 6/2/2021 15:40:27 25.25 77.45 93.00,71.90,3.90,211.00,12.90,12.80,5.00,4.60,-28.20,30.70,LOW,0,LOW,95,92,323.10,369.35,137.08,2.69,0.87,4.90,5.99,4.55,1.32,0.82
Wednesday 6/2/2021 15:40:30 25.25 77.45 93.00,72.90,3.90,211.00,12.90,12.80,5.90,4.60,-28.20,30.62,LOW,0,LOW,95,92,329.74,374.97,136.04,2.76,0.88,5.70,7.59,5.16,1.47,0.75

thx, I dumped that into a spreadsheet and it all looks "OK-ish"

Not sure what you call 'dirty'

Thanks J-M-L, I import that text file into Excel using comma and space delimiters. The thing is If I want to do any calculation with that Current I can't trust it. I have done a work around though. In Excel I create a Calculated Current column where I use the Watts and the Voltage, which do seem consistent, to calculate the current.

I'm just trying to solve the initial problem of getting dirty current data. Since it is not consistent, I call it dirty. I imagine getting gibberish would be more dirty. I don't want to have to use a work around, when I know something is amiss.

OK so the device is sending correct, non corrupted ASCII data but they do not make sense. That's what you mean by dirty.

Sounds like you need to verify proper functioning and if necessary, calibrate the sensor, rather than come up with a "workaround".

just to be sure this has nothing to do with your coding or missing data input because of slow stuff elsewhere and buffers filling up. Could you run this

void setup() {
  Serial.begin(115200);   //Serial is the USB cable Serial Monitor connection to computer
  Serial1.begin(2400);    //Serial1 is pin 18 (Tx) & 19 (Rx) from the battery monitor
}

void loop() {
  if (Serial1.available()) {
    byte r = Serial1.read();
    Serial.write(r);
    if (r == '%') Serial.println();
  }
}

and see if you get the same data (open your serial monitor at 115200 bauds)

Now that is an interesting suggestion. Thanks, I give that a try.

Thanks jrremington, the Bogart Engineering 2030 has a shunt as its current input. The ASCII signal coming out of this unit is not something that can be calibrated. As I mentioned above, all of the rest of the data is correct and the Current, occasionally correct, but just as quickly it will send out a value that is the look alike of the Voltage , but with the decimal point moved over a position or some other value that is equally arbitrary. I will scour there web page to see if they have any discussion of a problem like mine.

that's what you'll have to qualify. is It what is actually send or is it what your code sees for whatever reason.
Code in #17 should help see what's really being sent