Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Učebnice programování Arduino
Jdi na stránku Předchozí  1, 2
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
p32



Založen: Jan 13, 2007
Příspěvky: 15516
Bydliště: Olomouc

PříspěvekZaslal: út červenec 04 2017, 5:30    Předmět: Citovat

Celeron napsal(a):
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í?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Celeron



Založen: Apr 02, 2011
Příspěvky: 17753
Bydliště: Nový Bydžov

PříspěvekZaslal: út červenec 04 2017, 8:15    Předmět: Citovat

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 ?!!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
dobrman



Založen: Aug 12, 2012
Příspěvky: 1511
Bydliště: J H

PříspěvekZaslal: út červenec 04 2017, 8:56    Předmět: Citovat

on v tom kousku kódu nemá definice proměnných
readString je proměnná Smile
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();
}
}
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Celeron



Založen: Apr 02, 2011
Příspěvky: 17753
Bydliště: Nový Bydžov

PříspěvekZaslal: út červenec 04 2017, 12:06    Předmět: Citovat

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:

#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.



serial_monitor.png
 Komentář:

Stáhnout
 Soubor:  serial_monitor.png
 Velikost:  49.07 kB
 Staženo:  181 krát


_________________
Jirka

Proč mi nemůže všechno chodit hned ?!!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3697
Bydliště: Praha

PříspěvekZaslal: út červenec 04 2017, 23:54    Předmět: Citovat

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

dataJeti.remove(0);


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

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 napsal(a):

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:

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-atmel-studio-6-with-arduino-projects/

Jo a na desce Arduino je pak potřeba odpojit resetovací kondík, jinak nebude fungovat DebugWire.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2
Strana 2 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.25 sekund