Učebnice programování Arduino

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
p32
Příspěvky: 16427
Registrován: 13 led 2007, 00:00

#16 Příspěvek od p32 »

Celeron píše: a když přijde, plním "vstupní buffer"- řetězec z paketu a když přijde koncový znak 0FFh, tak řetězec zpracuju, tedy zatím kontrolně vypíšu na PC. To mi chodí. Když jde další paket 34 znaků, tak se mi řadí do "vstupního bufferu"-řetězce za předešlý paket(

Když skočíš na začátek na čtení startovacího znaku, tak tam máš ten řetězec zároveň vynulovaný nebo jsi to vynulování udělal ještě před začátkem čtení startovacího znaku a skáčeš až za to vynulování?
Uživatelský avatar
Celeron
Příspěvky: 20512
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#17 Příspěvek od Celeron »

Ale já nevím, jak ten string vynulovat. Definuju ho ještě před void setup String dataJeti. Po příjmu prvního paketu je vše v pořádku. Pokud ho zkusím po vytištění stringu znova definovat jako String dataJeti, tak to nemá žádnej vliv a další paket se připojí na konec předešlýho. Pokud ho zkusím znova nadefinovat jako String dataJeti = (" 34 mezer ") tak se za první paket připojí 34 mezer a třetí paket se připojí za ty mezery.

Zkoušel jsem projít ten prográmek z odkazu, co jsi mi poslal, co napsal Graynomad Jan 27, 2011, 05:53 pm. Při překladu to hází mraky strukturálních chyb. Myslím, že to ani nevyzkoušel. Jedině že by to bylo mě naprosto neznámejma definicema těch jeho
readstring a c Vyzkoušel jsem char i int a stále stejný.
Jirka

Proč mi nemůže všechno chodit hned ?!!
Uživatelský avatar
dobrman
Příspěvky: 1512
Registrován: 12 srp 2012, 00:00
Bydliště: J H

#18 Příspěvek od dobrman »

on v tom kousku kódu nemá definice proměnných
readString je proměnná :)
tady je něco podobnýho (od uživatele marklar)
viz


//-- may need 9600 or your standard baud rate
#define SERIAL_BAUD_DEFAULT 19200
//-- global var to hold string as it is read
String readString = "";

void setup(){
Serial.begin(SERIAL_BAUD_DEFAULT);
}

//-- process the pending string once a delim hit
void processString(){
//--- Check String
if( readString == "<T1>" ){
Serial.println("T1 Trigger");
} else {
Serial.println(readString);
}
// důležitý je tohle, tady tu proměnnou vyčistí
//--- Clear String for more reading
readString = "";
}

void loop(){
while (Serial.available() > 0) {
char c = Serial.read();
readString += c;
//-- If we see the end delim character ..
// then process the string, which clears it
if( c == 62 ){ //> char
processString();
}
}
}
Uživatelský avatar
Celeron
Příspěvky: 20512
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#19 Příspěvek od Celeron »

to dobrman: Tak to pomohlo, díky! Přikládám to co jsem zplodil a co mi vypisuje přijmutej string 32 Ascii znaků na sériovej monitor.
Neptej se mě, přoč co dělám, protože to nevím. Pouze jsem zpatlal dohromady systémem pokus omyl pár příkladů z netu.

Kód: Vybrat vše

#include "SoftwareSerialO2.h"
//**********deklarace proměnných*************
SoftwareSerial JetiSerial(-1, -1);
//char data;          // jeden znak - z Jeti jdou data po znacích
String dataJeti="";   // relace dat z Jeti po jednom znaku ukládat do řetězce
bool newdata;        // indikátor nových dat
//*************Nastavení**********************
void setup() {
// nastavení sériové linky z Jeti
  JetiSerial.Init(9, 10);              // RX pin, TX pin
  JetiSerial.begin(9600, true, 2, 1);  // rychlost, bit9, 2b stop, 1b parita
  JetiSerial.rxMode();                 // jen příjem
  Serial.begin(115200);                // rychlost do PC
  while (!Serial) {;}                  // čekej na potvrzení z PC
  Serial.println("Init done");         // výpis na PC
   newdata = false;
}
//********Hlavní smyčka programu***************
void loop() {
  nactidata();                         // podprogram načtení string
   if (newdata)  zpracujdata();
   newdata = false;
            }
  //***********************************
 void nactidata()
    {
      if (JetiSerial.available())              //dokud jsou na výstupu Jeti data ke čtení
       {
         bool is9bit = false;
         unsigned char data = JetiSerial.read9(&is9bit);  //čteme po jednom znaku
         if (data ==0xFF)
           {
           newdata = true;
           return;
           }
        dataJeti = dataJeti + char (data);              // přidání znaku do řetězce               
       }
    }         
 //-------------------------------------
    void zpracujdata()
    {
   dataJeti.remove(0,2);
      Serial.println (dataJeti);
     if (dataJeti.substring(2,6) == "Ulow")
                {
                Serial.print("Minimalni napeti");
  //             unsigned char cislo=dataJeti.substring(15,1);
              }
    dataJeti="";
  }

V tom zpracuj data jsem se pokusil vyházet počáteční nepotřebný znaky a rozebrat přijatý řetěz. Ta Ulow mi chodí, ale nevím, jak z řetězce dolovat jednotlivý znaky do proměnný. Ten substring(15.1) je syntax err.
Prostě každej řádek je boj a hledání a učení toho je časově nezvládnutelný a už mě to přestává bavit. Kdybych se vykašlal na slavný Arduino, v A51 na Silabu bych to měl možná už napsaný a na rozdíl od tohodle bych aspoň věděl, co dělám a mohl se na HW emulátoru kouknout co se v tom procíku děje.
v tom výpisu je vlastně dvouřádkovej výpis telemetrí. Za 1 je první řádek, za 2 je druhý řádek. Pak tam je zkušební rozeznání hlášky Ulow.
Přílohy
serial_monitor.png
(49.07 KiB) Staženo 235 x
Jirka

Proč mi nemůže všechno chodit hned ?!!
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#20 Příspěvek od mtajovsky »

Raději bych použil metodu String::remove() pro vymazání obsahu

Kód: Vybrat vše

dataJeti.remove(0);


a pro definici stringu konstruktor String::String(const char *cstr = "")

Kód: Vybrat vše

String dataJeti;    // uplně to stačí vzhledem k defaultnímu parametru konstruktoru


Používání přetíženého operátoru = vede ke zbytečnému vyvolávání kopírování paměti. Pro bližší informaci viz soubory WString.h a WString.cpp.

Celeron píše:Prostě každej řádek je boj a hledání a učení toho je časově nezvládnutelný a už mě to přestává bavit. Kdybych se vykašlal na slavný Arduino, v A51 na Silabu bych to měl možná už napsaný a na rozdíl od tohodle bych aspoň věděl, co dělám a mohl se na HW emulátoru kouknout co se v tom procíku děje.
To není otázka Arduina, ale tvé neznalosti C/C++. Potom je to samozřejmě boj.

Znak na pozici n se získá metodou String::charAt(n)

Kód: Vybrat vše

char c;
...
c = dataJeti.charAt(n);


Podívej se na referenci stringu:
https://www.arduino.cc/en/Reference/StringObject

Pokud máš HW debugger podporovaný v Atmel Studiu, VŘELE doporučuji zanechat práce v IDE Arduino a přejít na AS. Z Arduina používat jen knihovny, hlavně core knihovnu pro ovládání procesoru. Na netu je dobře popsáno na několik způsobů, jak přechod udělat.
http://www.engblaze.com/tutorial-using- ... -projects/

Jo a na desce Arduino je pak potřeba odpojit resetovací kondík, jinak nebude fungovat DebugWire.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“