Stránka 4 z 5
Re: Komunikace Arduino-Nextion
Napsal: 15 úno 2020, 17:43
od tosik
Zdar. začínám a zkouším tady nabrané poznatky a nedaří se. Chci z jednoho Arduina poslat něco do druhého přes sériovou linku a pokud je první znak třeba A, tak aby načetl první dva znaky a vytiskl je na sériovou linku. Z prvního pošlu, ale druhé cosi přijme, ale špatně zpracuje.
Vysílací Arduino
Kód: Vybrat vše
//Arduino Nano
unsigned long milis = 0;
void setup(){
Serial.begin(9600);
}
void loop(){
unsigned long cas = millis();
if (millis() - milis > 2000) {
String zprava = "A23";
Serial.println(zprava);
milis = millis();
}
}
Na prvním Arduinu mi serial monitor zobrazuje co 2 sekundy: A23. (mám dva počítače, dva sériové monitory otevřené pro každé Arduino zvlášť)
Přijímací Arduino
Kód: Vybrat vše
byte page, objekt;
void setup(){
//pinMode(13, OUTPUT);
Serial.begin(9600);
Serial3.begin(9600);
}
void loop(){
while(Serial3.available())
{
if (Serial3.read() == "A")
{
delay(20);
page = Serial3.read();
objekt = Serial3.read();
}
while (Serial3.available())
{
Serial3.read();
}
Serial.println(page);
Serial.println(objekt);
page = "";
objekt = "";
Serial.println("--------------------------------");
}
delay(100);
}
Výstup:
17:40:17.577 -> --------------------------------
17:40:19.593 -> 22
17:40:19.593 -> 22
17:40:19.593 -> --------------------------------
17:40:21.617 -> 22
17:40:21.617 -> 22
17:40:21.617 -> --------------------------------
17:40:23.641 -> 22
17:40:23.641 -> 22
17:40:23.641 -> --------------------------------
17:40:25.664 -> 22
17:40:25.664 -> 22
17:40:25.664 -> --------------------------------
Stále dvacet dvojky, a to i když pošlu jiné čísla z prvního Arduina. A nevyhodnotí mi to, že první by mělo být A. Nakopne mně někdo, co mám opravit? Kde mám chybu? Já bych řekl, že špatně zpracovávám načtení z linky... Nějak přetypovat?
Re: Komunikace Arduino-Nextion
Napsal: 15 úno 2020, 17:59
od tosik
Potřebuji to taky pro komunikaci s Nextionem. Z něj ta příchozí zpráva vypadá jak? Manuál píše 0x65 0x00 0x00 …, ale simulátor má jen dvojmístné hodnoty, 65 00 00 ... .A co ty mezery? To 0x65 je v hexadec. tvaru, že? Úplně nechápu, co vlastně dostanu. Astromik má v podmínce 0x65 (1. bajt) a pak načítá další bajty jako byte... a co ty mezery? Jakl si pošlu cvičně z jednoho Arduina nějakou cvičnou zprávu, abych jím simuloval Nextion?
To je asi špatně, ne?
Re: Komunikace Arduino-Nextion
Napsal: 15 úno 2020, 19:56
od AstroMiK
K tomu přijímacímu kódu
Tam máš zásadní chybu v týhle řádce:
Správně by to mělo být takhle:
Ale musíš pamatovat na to, že se nezobrazí znaky '2' a '3' , ale jejich desítkové ASCII kódy (50 a 51)
Pokud bys chěl dostat zpátky čitelné znaky '2' a '3', musel bys u část, ve které se vypisují hodnoty do Sériového monitoru, zapsat takhle:
Kód: Vybrat vše
Serial.write(page);
Serial.print('\n');
Serial.write(objekt);
Serial.print('\n');
Re: Komunikace Arduino-Nextion
Napsal: 15 úno 2020, 20:10
od AstroMiK
A k dalšímu dotazu:
Kdyby Nextion byl jakoby Arduino, tak ta zpráva by se z něj odesílala takhle:
Kód: Vybrat vše
Serial.write(0x65); // touch event (dotyk nebo uvolnění displeje)
Serial.write(0x00); // index stránky = 0
Serial.write(0x01); // index objektu na stránce = 1
Serial.write(0x00); // uvolnění (pro stisk by to bylo 0x01)
Serial.write(0xFF); // konec hlášení
Serial.write(0xFF);
Serial.write(0xFF);
Opravdový výstup z displeje do Arduina je vidět v mém příspěvku z 25 pro 2019, 10:44 (v tomhle vlákně o stránku zpátky)
Třeba ta část, co je fialově zakroužkovaná v obrázku Hercules terminálu (ty jednové bajty jsou zobrazené hexadecimálně a každý bajt je v jedné složené závorce).
Re: Komunikace Arduino-Nextion
Napsal: 16 úno 2020, 13:33
od tosik
Super, už jsem to zpracoval. Chápu to správně, že když načtu ze sériové linky hodnotu poslanou jako Serial.write(0x00), tak to budu mít jako jeden bajt? Stačí mi tedy volat page = Serial.read()? Jěště bych poprosil o postrčení, jak z toho vytáhnu tu hodnotu nula? Můžu použít indexOf (najdu x) a substring načíst jen poslední dva znaky z řetězce 0x00? A pak to převést na číslo.... Nebo je lepší způsob?
Re: Komunikace Arduino-Nextion
Napsal: 16 úno 2020, 14:20
od tosik
Taky by mně zajímalo, jaký je vlastně rozdíl mezi " " a ' '. Doteď jsem si myslel, že je jedno, které uvozovky použiji...

Re: Komunikace Arduino-Nextion
Napsal: 16 úno 2020, 18:36
od kiRRow
neumím to moc dobře vysvětlit ... ale asi tak nějak :
jednoduché uvozovky jsou pro znak a dvojté pro řetězec znaků ...
x = 'a';
je brán jako jeden byte ... obsahuje číselnou hodnotu reprezentující znak 'a'
x = "a";
zabere dva byty, protože je brán jako pole znaků ... v jednom je napsáno 'a' a v druhém ukončovací znak řetězce '\0'
-----
ps : byl bych opravdu rád, kdyby se k tomu vyjádřil Zbyšek ...

Re: Komunikace Arduino-Nextion
Napsal: 16 úno 2020, 18:42
od AstroMiK
... Nic převádět nemusíš.
Odeslané číslo 0x00 se na druhé straně přijme jako 0.
Odeslané 0x65 se přijme jako 101.
Pracuje se s tím jen jako s jedním bajtem. Takže hodnota je vždycky mezi 0 a 255.
Dokonce ani nemusíš odesílat ty čísla v hexadecimálním tvaru.
To jsem použil jen kvůli tomu, že to tak bylo zapsané v tom manuálu.
Klidně to můžeš odesílat takhle:
Kód: Vybrat vše
Serial.write(101); // touch event (dotyk nebo uvolnění displeje)
Serial.write(0); // index stránky = 0
Serial.write(1); // index objektu na stránce = 1
Serial.write(0); // uvolnění (pro stisk by to bylo 1)
Serial.write(255); // konec hlášení
Serial.write(255);
Serial.write(255);
nebo dokonce takhle:
Kód: Vybrat vše
Serial.write(0b1100101); // touch event (dotyk nebo uvolnění displeje)
Serial.write(0b0); // index stránky = 0
Serial.write(0b1); // index objektu na stránce = 1
Serial.write(0b0); // uvolnění (pro stisk by to bylo 0b1)
Serial.write(0b11111111); // konec hlášení
Serial.write(0b11111111);
Serial.write(0b11111111);
Výsledek na straně přijímače bude vždycky úplně stejný.
---
A k těm uvozovkám (zjednodušeně)
Dvojité uvozovky jsou na řetězec. A řetězec končí bajtem s hodnotou 0 (NULL).
Jednoduché uvozovky jsou na 1 znak
(s výjimkou zápisů jako třeba '\n', '\t', '\0', který jsou ale ve skutečnosti taky jen jeden znak)
PS. koukám že mě kiRRow o chvíli předběhl, ale máme na ty uvozovky asi stejný názor.
Re: Komunikace Arduino-Nextion
Napsal: 16 úno 2020, 19:21
od tosik
Jo takhléééé, to dává smysl, s těma uvozovkama. Ono už jsem určitě na to narazil, ale pokud to dostane člověk takhle polopaticky, lépe se to vstřebává.
Já jsem prostě hotový z toho, že odešlu na ser. linku 1 a monitor zobrazí myslím 49...

Sodoma gomora....
Díky moc za rady, jdu to nějak zpracovat a nasát...
Re: Komunikace Arduino-Nextion
Napsal: 16 úno 2020, 20:25
od AstroMiK
Myslím, že problém je v nepochopení rozdílu mezi příkazy Serial.print() a Serial.write().
Serial.print() posílá do sériové linky postupně řetězec, který je rozložený na jednotlivé znaky.
Takže třeba Serial.print(135) vezme číslo 135, rozloží ho na jednotlivé znaky a ASCII hodnotu každého toho znaku postupně odešle do linky.
Výsledkem tedy bude v sériové lince tenhle sled hodnot:
49
51
53
(protože ASCII kód znaku '1' je 49, ASCII kód znaku '3' je 51 a ASCII kód znaku '5' je 53)
Když se to pak pokusíš na straně přijímače přijmout pomocí funkce Serial.read(), získáš postupně ty 3 ASCII hodnoty.
S tím se docela blbě pracuje.
Místo Serial.read() by pak bylo lepší použít funkci Serial.parseInt(), která je tak inteligentní, že se pokusí z těch 3 přijatých ASCII hodnot zase zpátky složit číslo 135.
----
Daleko lepší mi ale přijde, když se už na odesílací straně nic nikam nepřevádí.
Prostě se jen pomocí Serial.write(135) odešle do sériové linky jediné číslo (bajt) s hodnotou 135.
Na straně přijímače se pak použije funkce Serial.read() a ten jeden jediný bajt se zase přečte, uloží do nějaké proměnné a dál se s ním pracuje.