Trodde detta skulle fungera, data från vakuumsensor

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Henry
Inlägg: 23588
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Trodde detta skulle fungera, data från vakuumsensor

Inlägg av Henry »

Jag skickar konstant en fråga till en vakuumsensor 10 ggr i sekunden genom Tx och får tillbaka ett svar inom max 100 ms då det är max hastighet som den accepterar. Får jag inget tillbaka överhuvudtaget så är antingen sensorn paj eller så är det vajsing med kommunikationen vilket jag vill veta då det är viktiga grejer som kommer att styras av denna sensor.

Jag slängde således ihop denna kod (visar bara det väsentliga) som jag tycker borde fungera så här:

Kod: Markera allt

void loop() {


  
  while (!Serial.available()) {        // Finns ingen info i den seriella bufferten (är väl så det är uppbyggt?) gör resten,
                                                    om det finns info hoppa över allt och gå vidare till nästa loop
    lcd.setCursor(8, 0);
    lcd.print("NO DATA!");
    delay(250);                           // Vänta så det verkligen är säkert att det finns data om den precis kom
    

  while (Serial.available()) {      // Finns info i bufferten gör resten, om inte gå tillbaka till start
      delay(5);
      value = Serial.readString();
      lcd.setCursor(8, 0);

      for (int mod = 7; mod < 14; mod++) {

        lcd.write(value[mod]);
        delay(5);

     }
    }
   }
  }

Men det enda som kommer upp är "NO DATA!" och även om jag skickar rätt svar så händer inget men ser att displayn flimrar till där det skall skrivas, jag missar uppenbarligen något men förstår inte vad.
Senast redigerad av MadModder 27 januari 2017, 22:10:51, redigerad totalt 3 gånger.
Anledning: rubrik
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: Trodde detta skulle funka

Inlägg av baron3d »

Utan att ha satt mig i den exakta funktionen, så tycker jag att det borde se ut som:

Kod: Markera allt

void loop() {
	if (!Serial.available()) {			// Finns ingen info i den seriella bufferten (är väl så det är uppbyggt?) 
													// gör resten,	om det finns info hoppa över allt och gå vidare till nästa loop
		lcd.setCursor(8, 0);
		lcd.print("NO DATA!");
		delay(250);								// Vänta så det verkligen är säkert att det finns data om den precis kom
	}

	else {		// Finns info i bufferten gör resten, om inte gå tillbaka till start
			delay(5);
			value = Serial.readString();
			lcd.setCursor(8, 0);

			for (int mod = 7; mod < 14; mod++) {
				lcd.write(value[mod]);
				delay(5);
			}
		}
	}
}
Användarvisningsbild
Henry
Inlägg: 23588
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Trodde detta skulle funka

Inlägg av Henry »

Ah just ja "if" glömde totalt bort och ja nu funkar i alla fall fall denna del i stort som den skall efter lite delay ändringar, tackar. :)
bearing
Inlägg: 11232
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Trodde detta skulle fungera, data från vakuumsensor

Inlägg av bearing »

Du borde använda systems tidräknare istället för delayer.
Som det är gjort nu kommer serierutinerna ta några ms utöver delayen. Så datan kommer inte skickas 10ggr per sekund, utan mer sällan.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Trodde detta skulle fungera, data från vakuumsensor

Inlägg av lillahuset »

Gör så här. Funkar bra. Jag använder det i "alla" mina projekt.

Kod: Markera allt

/**
  * @brief  check if *timer has timed out
  * @brief  initialise *timer by a call with ticks = 0
  * @param  timer: pointer to timer variable
  * @param  ticks: number of ticks to wait
  * @retval return 0 if not timeout, !0 if timeout
  * @date   2012-12-14
  */
int timeout(uint32_t *timer, uint32_t ticks)
{
  uint32_t t, diff;
  int tout;

  tout = 0;
  t = getTicks();
  diff = t - *timer;

  if (0 == ticks || diff >= ticks) {
    *timer = t;
    tout = 1;
  }

  return tout;
} /* timeout */
Användarvisningsbild
Henry
Inlägg: 23588
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Trodde detta skulle fungera, data från vakuumsensor

Inlägg av Henry »

bearing: Varför skulle serie rutinen ta så lång tid på sig? Det är dock inte extremt strikt med uppdateringen, om det blivit 9 eller 10 hade inte spelat någon större roll och det visade sig sedan också att om jag uppdaterar displayen 10 ggr/s så blir det inte helt oväntat gröt av siffrorna då ju LCD:er inte direkt är kända för sin snabbhet så jag var tvungen att dra ner det till 5 ggr/s som var helt perfekt.

Jag kanske ökar det lite sedan beroende på hur många decimaler jag kommer att använda mig av då det inte kommer att uppdateras lika snabbt om jag använder färre men en flimmerfri display är ju alltid fint.

Men det visade sig sedan faktiskt inte funka helt ändå pga att jag (föga överraskande) visade sig inte helt visste hur seriebufferten funkade. Jag trodde i min enfald att den tog datan som fanns och höll den tills nästa data kom då föregående direkt skrevs över, men så var visst inte riktigt fallet.

Om jag förstod det hela rätt så tar emot datan och behåller den ja, men sedan gör den inte ett dyft mer än till efter att en viss tid förflutit oavsett om det kommer mer data eller ej och detta hette visst något så enkelt som, Serial.setTimeout och som standard är detta satt till hela 1 sek så inte så konstigt att inget funkade oavsett vad. Efter att jag satt det som test till 50 ms så funkade dock allt precis som det skulle, i alla fall så som jag tänkt vls och testat i IDE med seriemonitorn.

Koden nu om någon vill se skiten:

Kod: Markera allt

void loop() {
  
Serial1.print("@254PR3?;FF");
        delay(200);
  
  if (!Serial1.available()) {
    lcd.setCursor(8, 0);
    lcd.print("NO DATA");

  }


  else {
    

    value = Serial1.readString();
    lcd.setCursor(8, 0);
    for (int mod = 7; mod < 14; mod++) {
      lcd.write(value[mod]);
        
    }
  }
}
Koden funkar det jag testat.

Den kod du nämner lillahuset tror jag att jag kopplar principen bakom (är dock helt grön på detta men inte planerat att lära mig mer än nödvändigt) och det hade säkert funkat det med så den sparas, tackar.
bearing
Inlägg: 11232
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Trodde detta skulle fungera, data från vakuumsensor

Inlägg av bearing »

Jo det stämmer ju att om du bara ska visa på displayen spelar det inte någon större roll.

Men jag brukar alltid fixa till en jämn samplingstid, för om jag t.ex. senare vill rita fina grafer på en PC är det bara att skicka iväg datan, så finns det automatiskt en tidbas i siffrorna.
Användarvisningsbild
Henry
Inlägg: 23588
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Trodde detta skulle fungera, data från vakuumsensor

Inlägg av Henry »

Du menar så, jo hade jag börjat med sådant grejs så hade jag nog fått välja ett annat sätt ja.
Skriv svar