// Serial read and "parse"
// funguje celkem dobře oběma směry, vyžaduje terminátor 0xFF
// po odeslání id command v 1.cyklu načte command a pak 2 cykly načte prázdné (ARDU posílá ještě 2x 0xFF)
//#define BUF_SIZE 66 // max 64 byte, delší rozdělí po 64 bytech - opakuje se readSerial
#define BUF_SIZE 16 // 64 byte je zbytečné, v podstatě stačí 4+3 byte
//char newMessage[BUF_SIZE] = { "" };
bool newMessageAvailable = false;
char terminator[1] = { 0xFF };
//char terminator[3] = { 0xFF, 0xFF, 0xFF }; //řetězec to nevezme
String newMessage;
uint8_t m_length; // length of new message
char TEST = 'X'; // X === 88 in ASCII
uint8_t iTEST = 65; // A === 65 in ASCII
void setup() {
Serial.begin(9600); // Spuštění sériové komunikace
Serial.setTimeout(50); // Zkrácení timeoutu na 50 ms pro rychlejší odezvu
Serial2.begin(9600, SERIAL_8N1, 16, 17); // hwUART2 e.g. pins RX=GPI16 TX=GPI17 for Nextion serial
}
void loop() {
/*
Serial2.println(" serin test ");
Serial2.print("j0.val=15");
Serial2.write(0xFF);
Serial2.write(0xFF);
Serial2.write(0xFF);
*/
/******************* from console on Serial ******************************************************************************/
// Kontrola, zda jsou v bufferu vůbec nějaká data k dispozici
if (Serial.available() > 0) {
// Načte text ze sériové linky, dokud nenarazí na odřádkování ('\n') // to ale NEX neposílá
// String newMessage = Serial.readStringUntil('\n');
String newMessage = Serial.readStringUntil('ÿ'); // ukončí při prvním znaku 0xFF,
//ale z NEX jdou ještě další dva 0xFF které načte ve dvou čtec.cyklech jako prázdné message
newMessage.trim(); // Odstraní případné neviditelné znaky na konci (např. '\r' při CR+LF)
m_length = newMessage.length();
Serial.print("Received from Serial ");
Serial.print(m_length);
Serial.println(" byte, indexed output :");
for(uint8_t index = 0; index < m_length+1; index++)
{
Serial.print(newMessage[index]); // mohu pracovat s jednotlivými byte pole
}
Serial.println("");
Serial.print("newMessage : ");
Serial.println(newMessage);
Serial.println(".....");
Serial2.print(newMessage);
Serial2.write(0xFF);
Serial2.write(0xFF);
Serial2.write(0xFF);
}
/******************* from NEX on Serial2 **********************************************************************************/
if (Serial2.available() > 0) {
// Načte text ze sériové linky, dokud nenarazí na klávesu Enter ('\n')
// String newMessage = Serial2.readStringUntil('\n'); // Nex neposílá \n a ardu vyskočí až timeoutem
// String newMessage = Serial2.readStringUntil('X'); // Nex pošlee X viz test a pak ardu nečeká na timeout
String newMessage = Serial2.readStringUntil(*terminator); // Nex pošlee X viz test a pak ardu nečeká na timeout
newMessage.trim(); // Odstraní případné neviditelné znaky na konci (např. '\r' při CR+LF)
m_length = newMessage.length();
// protože skončí na prvním výskytu 0xFF, tak pokračuje tiskem jen pro m_length>0, každý další výskyt 0xFF přečte a přeskočí
// ten počet 0xFF by se dal využít pro nějakou kontrolu
// POZOR - NEX nesmí posílat 0xFF nikde jinde než jako terminátor
if(m_length>0){
Serial.print("Received from Serial2 ");
Serial.print(m_length);
Serial.println(" byte, indexed output ");
for(uint8_t index = 0; index < m_length; index++)
{
Serial.print(":");
Serial.print(newMessage[index],HEX); // mohu pracovat s jednotlivými byte pole, HEXa výpis
}
Serial.println("");
for(uint8_t index = 0; index < m_length; index++)
{
Serial.print(":");
(newMessage[index]<10) ? Serial.print(" ") : Serial.print(""); // zpracovávám byty ze Stringu jako int proměnné
Serial.print(newMessage[index],DEC); // mohu pracovat s jednotlivými byte pole, DECim výpis
}
Serial.println("");
// Serial.print("newMessage : ");
// Serial.println(newMessage);
Serial.println(".....");
}
/* otestování konverzí - o.k.
Serial.println(char(65)); // převede int8 na char znak
Serial.println(int('A'), DEC); // převede char znak na int8
Serial.println(int(TEST), DEC); // převede char znak na int8
Serial.println(char(iTEST)); // převede int8 na char znak
*/
}
}