Go Down

Topic: [OPGELOST] if (Serial.available() > 0 ) vraag, uren gezocht maar ik zit vast... (Read 1 time) previous topic - next topic

Mar 01, 2015, 03:48 pm Last Edit: Mar 01, 2015, 08:09 pm by edr1924 Reason: video toegevoegd
Ik begrijp er niets van!  :smiley-eek:

M'n code werkt perfect TOTDAT ik een controle wil doen of er Seriele data binnenkomt en als dat NIET het geval is wil ik op een 7seg display een '9999' 'error code' weergeven.

Simpel dacht ik!


Ik dacht even een ELSE statement toe te voegen:

if (Serial.available() > 0 )
{
//code
}
else
{
//display error
}

Maar het werkt voor geen meter! De '9999' verschijnt continue op het display, serial data of niet...

Wat zie ik toch over het hoofd??

Video ter verduidelijking.

Volledige sketch
(link om sketch direct te zien en in te scrollen, geen download nodig)

Code: [Select]
//=====================================================================================================================
// processIncomingByte (called from LOOP)
//=====================================================================================================================
void processIncomingData()
{
  if (Serial.available() > 0 )
  {
    digitalWrite(DATARECEIVEDPIN, LOW);                                   // reset LED indicator
    serialData = Serial.read();                                           // read each byte as DECIMAL <ASCII> value
    if (serialData == '\r')                                               // look for end (CR) of the Serial message
    {                    
      positionCounter = 0;                                                // beginning of Serial message detected, reset position counter
      validData = 0;                                                      // no valid data yet...

    }                      
    else                      
    {                    
      switch (swVal)                                                      // process weather data according to dip switch value
      {                    
          /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
          case 3:                                                         // DIP SWITCH value 1: WIND SPEED KM/HOUR
            switch (positionCounter)
            {
              // once ever 1.9 seconds, the Weather Station puts out 115 different weather data values!
              // only WIND SPEED and WIND DIRECTION data appeares 3 times -evenly spaced-
              // in the serial data stream to get a higher refresh rate for these items.
              //
              // capture 1st instance of weather data data from serial stream
              case 5:                                                     // get 1st MSByte of 4 byte value at position 5 in serial stream
                byte0 = 4096 * ascii2hex(serialData);                     // convert incoming ASCII char to HEX and compute DEC value
                break;                                                    // break out and look for second byte
              case 6:                                                     // get 2nd byte
                byte1 = 256 * ascii2hex(serialData);
                break;
              case 7:                                                     // get 3rd byte
                byte2 = 16 * ascii2hex(serialData);
                break;
              case 8:
                byte3 = ascii2hex(serialData);                            // get 4th and LSByte, we are ready for conversion now!
                weatherData = (byte0 + byte1 + byte2 + byte3);            // add all DEC byes values together
                validData = 1;                                            // four bytes captured in so ready to display
                digitalWrite(DATARECEIVEDPIN, HIGH);
                break;
              // capture 2nd instance of weather data data from serial stream
              case 137:
                byte0 = 4096 * ascii2hex(serialData);
                break;
              case 138:
                byte1 = 256 * ascii2hex(serialData);
                break;
              case 139:
                byte2 = 16 * ascii2hex(serialData);
                break;
              case 140:
                byte3 = ascii2hex(serialData);
                weatherData = (byte0 + byte1 + byte2 + byte3);
                validData = 1;
                digitalWrite(DATARECEIVEDPIN, HIGH);
                break;
              // capture 3rd instance of weather data data from serial stream
              case 285:
                byte0 = 4096 * ascii2hex(serialData);
                break;
              case 286:
                byte1 = 256 * ascii2hex(serialData);
                break;
              case 287:
                byte2 = 16 * ascii2hex(serialData);
                break;
              case 288:
                byte3 = ascii2hex(serialData);
                weatherData = (byte0 + byte1 + byte2 + byte3);
                validData = 1;
                digitalWrite(DATARECEIVEDPIN, HIGH);
                break;
            } // switch
            positionCounter++;                                            // increase counter and repeat
            // DISPLAY DATA            
            if (validData == 1)                                           // display data only if data is present/changed
            {
              myDisplay.print((float)weatherData/10,1);                   // print the received weather data, divided/10
            }
            validData = 0;                                                // reset 'display data' flag
            break;
          /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
          case 4:                                                         // DIP SWITCH value 1: WIND SPEED BEAFORT
            // do something
            break;
          /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
          case 5:                                                         // DIP SWITCH value 1: WIND SPEED KM/H
            // do something
            break;
          /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
          case 6:                                                         // DIP SWITCH value 1: WIND SPEED M/S
            // do something
            break;
      } // switch(swVal)
    } // else
  } // if (Serial.available() > 0 )
  else
  {
    myDisplay.print(9999,0);                // NO SERIAL DATA so display 9999
  }
} // void processIncomingByte ()

nicoverduin

99% van de tijd komt er mogelijk niets binnen dus voor je het weet staat er 9999. Ik zie nergens dat je die weer uit zet. Ik heb verder niet in jouw sketch gekekene. Alleen hier ff.
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

Nee, er komt -continue- een stroom van data binnen...  
Zie video svp

En ik hoef de '9999' error code niet uit te zetten want zodra er weer data binnen komt, wordt er andere data weergegeven.


bedankt voor uw reactie!

Ik snap de oorzaak nu maar de oplossing nog niet...

De bruine lijn op de foto is inkomende data, ASCII
De rode lijn is een check of de serial buffer leeg is of niet.

Code: [Select]
while(!Serial.available())
  {
      digitalWrite(6, HIGH); // debug - output HIGH indien buffer leeg is
  }
 


HIGH = Buffer leeg
LOW = buffer vol

De buffer heeft helemaal geen kans om vol te lopen omdat elke byte er onmiddellijk wordt uitgehaald
Dus er wordt constant een 'buffer LEEG' signaal gegeven OOK als er wel data binnenkomt en de LED gaat inderdaad uit voor de duur van 47┬ÁS ;) dus dat schiet niet op...

Vraag is alleen hoe ik nu kan controleren of er echt geen data meer binnenkomt...
tips zijn welkom!  :D


nicoverduin

Dan zou je een timertje moeten zetten dat zodra het langer dan x tijd duurt, dan krijg je geen data meer.

Dus zodra je data binnen krijg, zet je de timer op bijv. millis() en in een test je test je uit of millis() - timer > TIME_OUT tijd en dan geef je 9999.
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

Ja, daar moet ik het zoeken, ik ga er mee aan de slag, bedankt voor de tip!

Leuke puzzels... :)

De timer bracht uitkomst...
bedankt!

Code: [Select]
//=====================================================================================================================
// processIncomingByte (called from LOOP)
//=====================================================================================================================
void processIncomingData()
{
  if (Serial.available())
  {
    digitalWrite(DATARECEIVEDPIN, LOW);                                   // reset LED indicator
    serialData = Serial.read();                                           // read each byte as DECIMAL <ASCII> value
    if (serialData == '\r')                                               // look for end (CR) of the Serial message
    {                    
      positionCounter = 0;                                                // beginning of Serial message detected, reset position counter
      validData = 0;                                                      // no valid data yet...
      heartbeat = millis();                                               // reset timer to indicate active Serial stream input
                    



Code: [Select]
void checkSerial()
{
  timeref = millis();                       // take time snapshot
  if (timeref-heartbeat > 3000)             // no serial stream data = no heartbeat time update
  {
    myDisplay.print(8888,0);                // display '8888' to indicate 'no serial data' condition
  }
}

Go Up