vastloper op serial.print

Arduino specifieke Software
Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: vastloper op serial.print

Berichtdoor Koepel » 13 Nov 2020, 15:32

Frans53! schreef:Een integer gaat eerst door de mallemolen om het MSB 0 te houden.

Die uitleg vind ik niet voldoende. Ik neem aan dat de twee bytes samen al een soort integer vormen. Waarom ga je er dan nog aan sleutelen ? Is daar eigenlijk wel een goede reden voor ?

Frans53! schreef:de while (Serial1.available() == 0) {} heb ik altijd nodig, omdat het programma af en toe sneller is dan de data binnen komt. En dan mis je data. Ook door schade en schande.

Het gaat om het principe. Je hebt nu iets ingebakken waardoor iets van buitenaf je sketch kan stilleggen. Dat is niet goed.
De oplossing is: Als er een byte binnenkomt, dan dat byte inlezen en in een buffer zetten. Dat doen bij iedere keer dat de loop() wordt uitgevoerd. Heb je een geheel commando of regel binnen, dan ga je die verwerken. Ik weet niet of je het eind van een regel kunt detecteren.
Elk byte dat via een seriële poort gaat heeft een start-bit en een stop-bit. Dat gebeurt in hardware.

Frans53! schreef:De "while (woord < 128)" heb ik in feite al uitgelegd, ik maak zelf het in laatste byte |128 als stopbit voor mijn datatrein. En dat werkt voortreffelijk.

Hier gaat het weer om het principe. Wat als zo'n getal er niet is.
Als er ergens een bug in je sketch zit, dan is het beter dat die bug niet door heel je sketch heen dendert.

Frans53! schreef:Ik heb heel veel behoefte om bibliotheken te maken.

Je kunt beginnen om meerdere tabbladen te maken. Bij zo'n 2000 regels ga ik dingen in apart tabbladen zetten. Ergens rechts-boven in de Arduino IDE zit een dingetje waar je op kunt klikken. Als je een bestandsnaam kiest zonder extensie, dan wordt er automatisch *.ino aan toegevoegd.
Je kunt natuurlijk ook een library maken met *.cpp en *.h bestanden. Er zal vast wel ergens een tutorial zijn. Je kunt ook een heel eenvoudige library installeren en die gaan ombouwen voor jezelf.

Frans53! schreef:Hoe krijg ik de tabel binnen de haken werkend

Het is gangbaar om een array als integer pointer te gebruiken.
Code: Alles selecteren
void Hallo( int *pTabel)
{
  Serial.print( "Hallo ");
  Serial.println( pTabel[2]);
}

Advertisement

Berichten: 65
Geregistreerd: 09 Jun 2020, 22:11
Woonplaats: Roosendaal

Re: vastloper op serial.print

Berichtdoor Frans53! » 14 Nov 2020, 01:16

Dag Koepel,

je schreef:
Ga je in de functie "KOMMAintLeesSD()" een negatief getal opnieuw opbouwen ? Dat lijkt me niet nodig. Het zullen toch wel twee bytes zijn die al 2's complement zijn ? Dan kun je gewoon in een int16_t zetten (met pointer of union of macro). Ik zou een union gebruiken als je zeker wilt zijn dat de eerste byte de MSB is.
Ook in "zetSerieelNaarInt()" gebeurt iets met een negatief getal wat ik niet begrijp. Kun je boven die functie zetten hoe de bits van plaats veranderen ?


Hier wil ik even op ingaan, omdat ik er nu tegenaan loop.
Opslaan kan ik alleen in bytes.
Wil ik van 2 bytes een integer maken, dan gaat dat prima met positieve getallen. Met negatieve getallen gaat dat niet, omdat je niet zoiets hebt als
int getal = int(hi,lo); dat bestaat alleen in word(hi,lo); Vandaar die kromme constructie, die overigens terdege is uitgetest.
Ik weet niet wat union is, ja, misschien uien..., zelfde pointer en macro, die begrijp ik niet, en staan niet in arduino reference.
De "zetSerieelNaarInt()" heb ik dacht ik al uitgelegd; omdat ik het hoogste bit van elke byte altijd 0 moet hebben, heb ik deze constructie bedacht. Alleen het laatse byte van de datatrein MOET hoogste bit een 1 zijn, want daar test ik op als stopbit.

In de sketch hier zet ik het even op een rijtje; eerste van integer naar seriele opmaak, Daarna weer terug.
Code: Alles selecteren

 word zetIntNaarSerieel(int _getal)
  {
    word g1(abs(_getal));           // positief maken, zodat ik een normaal positief getal heb.(alle bitjes normaal)
    g1 *= 2;                        // 1 bit opschuiven naar links, hierdoor komt LSB op 0.
    byte _hi = highByte(g1);        // splitsen
    byte _lo = lowByte(g1);
    _hi *= 2;                       // hi 1 bit naar links, hierdoor komt LSB vrij.
    bitWrite(_hi,0,bitRead(_lo,7)); // bit lo7 gaat naar hi0.
    bitClear(_lo,7);                // bit lo7 wissen (voorwaarde voor serieel byte)
    bitClear(_hi,7);                // bit ho7 wissen, (idem.)
    if(_getal < 0)                  // test of oorspronkelijk getal negatief is
      {
        bitSet(_lo,0);              // negatief-bit bit lo0 is mijn negatief bit.
      }     
    return word(_hi&127,_lo&127);   // als één return, nogmaals afgeroomd &127 (zeker weten)
                                    // hierdoor is het grootste getal + en - 8191, maar voor mij prima.
  }

int leesIntUitData()
  {
    byte hi = leesByteUitData();  // bytes uit serieelbuffer
    byte lo = leesByteUitData();
    word _getal = word(hi,lo);    // dit word-getal is geen zuiver getal, maar bewerkt.
   
    int intGetal = zetSerieelNaarInt(_getal);
    return intGetal;
  }

int zetSerieelNaarInt(word _Swaarde)
  {
    byte _hi = highByte(_Swaarde);// Split in hi en lo.
    byte _lo = lowByte(_Swaarde);
    byte neg = bitRead(_lo,0);    // negatief bit markeren
    _lo *= 2;                     // lo 1 bit naar links. dit kan, omdat MSB 0 is.
    word g1 = word(_hi,_lo);      // maak er weer een word van, getal weer mooi aan elkaar gemaakt.
    g1 /= 4;                      // schuif alles 2 bits naar rechts. Dit is het echte absolute getal.
    int g2 = int(g1);             // maak er een integer van, positief
    if(neg == 1)                  // als negatief ?...
      {
        g2 = -g2;                 //....  maak negatief.
      }
    return g2;
  } 

Berichten: 65
Geregistreerd: 09 Jun 2020, 22:11
Woonplaats: Roosendaal

Re: vastloper op serial.print

Berichtdoor Frans53! » 14 Nov 2020, 01:26

Dag koepel,

je schreef:
Elk byte dat via een seriële poort gaat heeft een start-bit en een stop-bit. Dat gebeurt in hardware.


Maar hoe ga ik daar mee om? Kan ik daarop testen? Hoe test ik dat ik mijn seriele trein helemaal heb gehad? De lengte van die trein is altijd anders, wel altijd <64. Ik moet gewoon op het eind van de trein een merkbare byte maken, anders weet ik echt niet dat het mijn laatste byte is van de trein, want er kan nog meer in de buffer zetten, aar dat is dan weer een volgende trein.

vraag: In welke taat zijn de bibliotheekbestanden .h en .ccp geschreven? Dan kan ik er een studie van maken. Want nu begrijp ik er niet veel van.

Berichten: 65
Geregistreerd: 09 Jun 2020, 22:11
Woonplaats: Roosendaal

Re: vastloper op serial.print

Berichtdoor Frans53! » 14 Nov 2020, 01:28

Het is gangbaar om een array als integer pointer te gebruiken.


Oei, weer iets nieuws, heb ik altijd weten te voorkomen, maar nu moet het dus maar... :)

Berichten: 65
Geregistreerd: 09 Jun 2020, 22:11
Woonplaats: Roosendaal

Re: vastloper op serial.print

Berichtdoor Frans53! » 14 Nov 2020, 01:38

hey koepel.
ik ben ineens onze laatste berichten kwijt. Wat dat misschien in een ander bericht?

Berichten: 65
Geregistreerd: 09 Jun 2020, 22:11
Woonplaats: Roosendaal

Re: vastloper op serial.print

Berichtdoor Frans53! » 14 Nov 2020, 01:39

... en nu ineens weer wel. Waar kan dat aan liggen?

Berichten: 65
Geregistreerd: 09 Jun 2020, 22:11
Woonplaats: Roosendaal

Re: vastloper op serial.print

Berichtdoor Frans53! » 14 Nov 2020, 01:42

ah.. ik zie het al, we staan op 2 bladzijden. Beginnerzvoudju...

Berichten: 65
Geregistreerd: 09 Jun 2020, 22:11
Woonplaats: Roosendaal

Re: vastloper op serial.print

Berichtdoor Frans53! » 14 Nov 2020, 12:26

Je moet het in zijn geheel zien:
Code: Alles selecteren
    if(Serial1.available()>0)
      {
          leesData();
          .......
     
void leesData() // naar Buffer
  {
    telData = 0;
    int woord;
    do
      {
        while(Serial1.available() == 0) {}
        woord = Serial1.read();
        data[telData] = byte(woord);
        telData++;
      }
    while(woord < 128 && woord >= 0 && telData <= 64);
  }

De while {} zit al binnen de available {lees data.}
Dus er moet al eerst data zijn, voordat ik op de volgende wacht met de while available {}.
De praktijk was, dat ik vroegtijdig ui de eerste while schoot en daardoor data miste, of verkeerd geintrepeteerd werd, en daarom blijf ik nu wachten totdat ik weer data heb.
En ik krijg ALTIJD een byte met een MSB van 1, dat maak ik zelf met verzenden. DAT is dan mijn stopbit, of einde seriele trein, hoe je het ook wilt noemen.
Ik heb geen andere oplossing.

Ik merk het verschil met jou, dat ik zoek naar mogelijkheden, wat ook mijn karakter is, (mijn baas was heel blij met mij), en jij heel erg in vaste strukturen denkt. Dat vind ik op zich heel leerzaam.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: vastloper op serial.print

Berichtdoor shooter » 14 Nov 2020, 15:54

ik snap jouw manier van schrijven zoals een while en een lege {} erachter niet dan gebeurt er dus niks mee.
dan is de onderste regel ook ?? met een while en dan een } erachetr.
paul deelen
shooter@home.nl

Berichten: 65
Geregistreerd: 09 Jun 2020, 22:11
Woonplaats: Roosendaal

Re: vastloper op serial.print

Berichtdoor Frans53! » 14 Nov 2020, 17:03

Dag Paul,

Die {} is inderdaad een wachtlus, waarbij je zeker weet dat er nog iets aan te komen staat. Dat heb ik zelf in de hand, tenzij iemand de steker eruit trekt.... Die wachtlus heb ik door ervaring moeten plaatsen, omdat ik anders onvolledige data binnen kreeg, die niet meer te herleiden was. zooitje daardoor.

Die onderste regel is wat verwarrend. Die } op het eind is de afsluiter van de functie leesData(); Daarboven staat de onvolledige functie if serial...., alleen maar om aan te geven dat dit ervoor zat, en wel terdege gekoppeld moet zien aan LeesData-functie.

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: udwehov en 17 gasten