Komunikace Arduino-Nextion

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od tosik » 15 úno 2020, 17:43

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?

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od tosik » 15 úno 2020, 17:59

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?

Kód: Vybrat vše

Serial.print("0x60 0x00 0x00");
To je asi špatně, ne?

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od AstroMiK » 15 úno 2020, 19:56

K tomu přijímacímu kódu

Tam máš zásadní chybu v týhle řádce:

Kód: Vybrat vše

if (Serial3.read() == "A") 
Správně by to mělo být takhle:

Kód: Vybrat vše

if (Serial3.read() == 'A')


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');

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od AstroMiK » 15 úno 2020, 20:10

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

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od tosik » 16 úno 2020, 13:33

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?

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od tosik » 16 úno 2020, 14:20

Taky by mně zajímalo, jaký je vlastně rozdíl mezi " " a ' '. Doteď jsem si myslel, že je jedno, které uvozovky použiji... :D

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Komunikace Arduino-Nextion

Příspěvek od kiRRow » 16 úno 2020, 18:36

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 ... :)

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od AstroMiK » 16 úno 2020, 18:42

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

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od tosik » 16 úno 2020, 19:21

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... :-D Sodoma gomora....
Díky moc za rady, jdu to nějak zpracovat a nasát...

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od AstroMiK » 16 úno 2020, 20:25

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.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 12 hostů