Stránka 2 z 2
Napsal: 04 črc 2017, 06:30
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í?
Napsal: 04 črc 2017, 09:15
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ý.
Napsal: 04 črc 2017, 09:56
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();
}
}
}
Napsal: 04 črc 2017, 13:06
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.
Napsal: 05 črc 2017, 00:54
od mtajovsky
Raději bych použil metodu String::remove() pro vymazání obsahu
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)
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.