LCD seriale con scrittura che riesce e lettura che fallisce

Salve a tutti,

prima di tutto un ciao a fosfori verdi. Appena arrivato nel forum.

Ho una Arduino mega 2560, con un LCD su seriale della Grifo (il QTP03) e sto giocherellando a connetterlo alla seriale. Parlerebbe anche I2C ma per ora la seriale mi rende le cose più veloci. Questo LCD retroilluminato 20 x 4 ha anche 3 tasti ed un buzzer. Fin qui tutto bene. Collegato al pc tramite porta seriale, tramite hyperterminal ci scrivo e leggo il valore restituito alla pressione di uno dei tre tasti (tasto 1 leggo 1, tasto 2 leggo2 e tasto 3 premuto mi leggo 3). Fatta questa prova tramite jumpers ho configurato l' LCD per lavorare con i livelli TTL della seriale e l' ho agganciato alla mia bellissima Mega 2560. Pin rx 15 e tx 14 (seriale a livelli TTL, giusto ?). Ebbene riesco a scrivere sull' LCD, a mandare quindi anche sequenze di escape per pulire lo shermo e far suonare il buzzer, ma quando vado a leggere dalla seriale, invece di trovare il valore che la scheda dell' LCD scrive alla pressione di uno dei tasti, non trovo nulla e nessun dato mi arriva. Questo lo sketch approntato con pezzetti di esempi, ne ho anche provati altri di sketch modificati all' uopo, ma nulla. Come mai non riesco a leggere dalla seriale secondo voi ? Scriverci funziona sempre. Idee ?

Grazie mille,

Stefano.

#include <SoftwareSerial.h>
#define rxPin 15
#define txPin 14
#define serialPortBaudRate 9600

// set up a new serial port
SoftwareSerial serialPort =  SoftwareSerial(rxPin, txPin);

const byte COMMAND_BEEP[] = {0xFE,0x7};
const byte COMMAND_CLEAR_PAGE[] = {0xFE,0xC};
const byte COMMAND_SET_BUTTON_1_VALUE[] = {0xFE,0xA7};

const int SLEEP = 400;

void setup()
{
  initSerialLCD();
 
}

void initSerialLCD(){
 pinMode(rxPin, INPUT);
 pinMode(txPin, OUTPUT);
 // set the data rate for the SoftwareSerial port
 serialPort.begin(serialPortBaudRate);
 serialPort.listen();
 Serial.begin(serialPortBaudRate);
 serialPort.write(COMMAND_CLEAR_PAGE, sizeof(COMMAND_CLEAR_PAGE));
 //serialPort.write(COMMAND_SET_BUTTON_1_VALUE, sizeof(COMMAND_SET_BUTTON_1_VALUE));
 serialPort.println("Init done");
}
  
void loop()
{    
  delay(SLEEP);
  writeBufferToSerial();
  //serialPort.listen();
  int incomingByte;
  // send data only when you receive data:
  if(Serial.available() > 0) {
     // read the incoming byte:
     incomingByte = Serial.read();
     //Say what you got:
     //serialPort.print("I received: ");
     serialPort.println(incomingByte, DEC);
  }
  if(serialPort.available() > 0) {
     // read the incoming byte:
     //incomingByte = serialPort.peek();
     //Say what you got:
     //serialPort.print("I received: ");
     Serial.print(incomingByte, DEC);
  }
  
}

void writeBufferToSerial(){
  //serialPort.write(COMMAND_BEEP, sizeof(COMMAND_BEEP));
  
}  

void serialEvent() {
  while (serialPort.available()) {
    // get the new byte:
    char inChar = (char)serialPort.read();
    // add it to the inputString:
    //inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    /*
   if (inChar == '\n') {
     stringComplete = true;
   }
  */
   serialPort.println("XXXXXX");
  }
  serialPort.println("DDDDDDDD");
}

Benvenuto nel Forum!

La Arduino MEGA 2560 possiede un buon numero di porte seriali hardware in più rispetto ad Arduino UNO (che, poverina, ne ha solo una!).

Non è necessario, quindi, usare la libreria SoftwareSerial pensata per sopperire a questa mancanza e neanche indicare i pin di Rx e Tx in quanto già prefissati.

Devi semplicemente inizializzare la porta in Setup [ Serial3.begin(9600) ] ed usare le stesse funzioni usate per la Serial0 alias Serial.

Ettore Massimo Albani

Salve,

grazie mille, riscritto lo sketch ed ora va, leggo e scrivo. Stranissimo che però prima scrivesse soltanto. Questo per futura memoria lo sketch che sulla Mega mi funziona, per quanto banale possa essere.

#define serialPortBaudRate 9600

const byte COMMAND_CLEAR_PAGE[] = {0xFE,0xC};

const int SLEEP = 100;

void setup(){
  
 Serial3.begin(serialPortBaudRate);
 Serial3.write(COMMAND_CLEAR_PAGE, sizeof(COMMAND_CLEAR_PAGE));
 Serial3.println("Init completed");
  
}
void loop(){    
  delay(SLEEP);
  int incomingByte;
   
  if(Serial3.available() > 0) {
     Serial3.write(COMMAND_CLEAR_PAGE, sizeof(COMMAND_CLEAR_PAGE));
     incomingByte = Serial3.read();
     Serial3.println(incomingByte, DEC);
  }
}