Blir snart tokig, får bara inte ihop detta

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

Blir snart tokig, får bara inte ihop detta

Inlägg av Henry »

Har hållit på med att få en viss del av en seriedata från Tx porten att skrivas ut på en display och har hållit på med detta i över en vecka nu utan några större framgångar, mest förstås för att jag inte helt lärt mig allt än och för att ingenting överhuvudtaget är uppenbart i C.

Har dock kollat mängder (har tex nu 60 tabs öppna om detta) med exempel med serial.read, read.string, char och dylika grejer som jag tycker borde ha något med detta att göra. Har plockat ut grejer från andra koder som jag trodde skulle fungera men ingen av dessa har sedan fungerat ihopsatta så att säga då det har klagats på både det ena och det andra, men förstås för att jag inte haft koll.

Så nu ger jag upp och hoppas någon här kanske kan ha något tips på hur göra med skitet innan jag sliter av mig allt hår.


Jag skriver vad jag tror de olika delarna gör och så men jag har nog fel i stor del av fallen så be gentle och se mig typ som en 5 åring om ni skall förklara något. Men jag vet att det nog är fel på mer än ett ställe och att det saknas grejer och vissa kanske inte ens behöver vara där och för den delen också för att koden, föga förvånande, inte heller fungerar.

Nu skrivs det bara ut x.xxExx kontinuerligt på hela displayen, men det är ju bla för att jag inte fått ihop den seriella delen.

Jag lutar dock ev lite åt serialread, readstring, char eller dylika grejer tillsammans med vartannat på någon höger, men jag kan för den delen också vara helt ute och cykla för vad allt jag vet. :/


Nåja här är skiten om någon ev orkar bemöda sig:


Kod: Markera allt


#include <LiquidCrystal.h>

char text;                                                 // initering så att infon från serial kan läggs
                                                               // i "text" och att det är i form av karaktärer.. tror jag

LiquidCrystal lcd(40, 42, 28, 26, 24, 22);



String readString;                                    // När den seriella strängen läses
                                                              // så handlar det om en sträng och
                                                             // inget annat, tror jag det betyder


void setup() {


  char vakuum[] = "@254ACKx.xxExx;FF";      // Längden på texten sätter "char" buffertens
                                                                   // storlek och namnger den
                                                                   //"vakuum".. tror jag

  Serial.begin(9600);

  lcd.begin(20, 4);

  delay(1500);                                            // Så att displayen hinner initieras klart


  lcd.print("Vacuum: ");  // Självförklarande
  lcd.setCursor(16, 0);    
  lcd.print("Torr");          
  lcd.setCursor(8, 0);     

}


void loop() {


  Serial.write("@254PR3?;FF");        // Skicka denna fråga till vakuummätaren
                                                     // och få direkt tillbaka vakuumnivån tex "@254ACK5.21E-7;FF"
                                                    // Jag vill dock bara ha texten mellan tecknen 7 och 14


  while (Serial.available() == 0) {    // Om det finns någon som helst data på Rx - gå
                                                     // vidare i programmet, inte annars


    delay(10);                                  // Var säker på att allt hinner komma så vänta lite





    // Vad som sedan skall användas runt här för att få tag på datan och användas i slutet nedan i "vac" har jag inte
    // fått ihop men gissar väl (?) på att "text" skall fyllas genom kanske tex serial.read eller nåt på något sätt men tycker mig
    // ha testat både hit och dit med både det ena och det andra utan att få det att fungera som tänkt





    char text[] = "@254ACKx.xxExx;FF";      // Initierar en buffert mha textens storlek så det vet
                                                               // hur mycket utrymme som skall reserveras för "text", tror jag


    for (int v = 7; v < 14; v++) {                // En integer "v" för att gå igenom steg 7 tom steg 14


      lcd.write(text[v]);                               // Ta hela värdet från serieinläsningen  " ??? "  och gör vad
                                                              //  som sägs för "v" och skriv därefter ut resultatet
                                                              // Alltså skriv ut enbart tecknen 7 tom 14 i den
                                                              // mottagna seriella texten


      delay(25);                                       // Repetera i lagom takt så att den långsamma lcd:n hänger med
                                                            
                                                            // Trodde dock att hela texten skulle skrivas ut som en hel del men den
                                                            // sekvenserar igenom texten och skriver var tecken för sig, kvittar
                                                            // förstås som så och tror också det gör att jag kan dra upp hastigheten

    }

  }
}

Ovan kod skriver, som förväntat, ut Vacuum och Torr på rätt ställen men lika väntat så skriver den inte ut det den skall utan x.xxExx en gång, dock precis där det skall vara, men 25 ms senare skriver den ut detta kontinuerligt på hela displayen.

Skickar jag vad som helst i Serial Monitor (koden har redan skickat det den skall en gång) så slutar displayen att upprepa men det jag skriver in på Serial Monitor upprepas märkligt nog kontinuerligt där i stället.

Detta att den skriver ut på hela displayen går förstås att fixa genom att sätta displaytexten och det där i loopen med en lcd.clear tex men det är problem No 1 i början ovan som är det som är högprioriterat.
Zkronk
Inlägg: 1423
Blev medlem: 23 augusti 2005, 16:44:36
Ort: Uppsala

Re: Blir snart tokig, får bara inte ihop detta

Inlägg av Zkronk »

Du kommer inte in i ditt sista kodblock när du har data att hämta i din seriella buffer, utan bara när buffern är tom.
Metoden Serial.available returnerar första byten som ligger i buffern när det finns data där, och inte en 0:a som du väntar på.
Så lika som i exemplet jag länkat nedan så bör du kolla när den metoden returnerar ett tal som är större än noll i stället.

Kod: Markera allt

while (Serial.available() == 0) {
För att börja plocka ut tecknen ur den seriella buffern använder du metoden Serial.read().
https://www.arduino.cc/en/Serial/Read
Som parantes som kommer den flaggan du läser ut med Serial.available() sättas till 0 automatiskt när du läst ut alla tecken du tagit emot och buffern är tom igen.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Blir snart tokig, får bara inte ihop detta

Inlägg av Mr Andersson »

> Metoden Serial.available returnerar första byten som ligger i buffern när det finns data där, och inte en 0:a som du väntar på.

Du tänker på peek(). available() ger antal olästa bytes i bufferten. Fast det ger samma resultat. Koden körs bara om det inte finns data att hämta.
Användarvisningsbild
Henry
Inlägg: 23588
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Blir snart tokig, får bara inte ihop detta

Inlägg av Henry »

Zronk: aha, dåligt val med 0 mao. Trodde mer det sade att med info lika med 0 alltså ingenting, men det är alltså bokstavligt så att säga, då vet man det.

Ok så det är serial.read jag skall använda, menar väl det, då får jag klura lite med detta igen, tackar.
Skriv svar