Sida 1 av 1
Trodde detta skulle fungera, data från vakuumsensor
Postat: 26 januari 2017, 22:34:58
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.
Re: Trodde detta skulle funka
Postat: 26 januari 2017, 23:11:36
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);
}
}
}
}
Re: Trodde detta skulle funka
Postat: 26 januari 2017, 23:42:12
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.

Re: Trodde detta skulle fungera, data från vakuumsensor
Postat: 2 februari 2017, 14:20:28
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.
Re: Trodde detta skulle fungera, data från vakuumsensor
Postat: 2 februari 2017, 14:46:25
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 */
Re: Trodde detta skulle fungera, data från vakuumsensor
Postat: 2 februari 2017, 15:56:00
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.
Re: Trodde detta skulle fungera, data från vakuumsensor
Postat: 2 februari 2017, 16:32:14
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.
Re: Trodde detta skulle fungera, data från vakuumsensor
Postat: 2 februari 2017, 16:36:18
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.