Go Down

Topic: LCD seriale con scrittura che riesce e lettura che fallisce (Read 571 times) previous topic - next topic

stefano_falconetti

Oct 22, 2012, 03:31 pm Last Edit: Oct 22, 2012, 08:39 pm by UweFederer Reason: 1
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.


Code: [Select]
#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");
}


cyberhs

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


stefano_falconetti

#2
Oct 22, 2012, 08:28 pm Last Edit: Oct 22, 2012, 08:42 pm by UweFederer Reason: 1
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.

Code: [Select]
#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);
  }
}

Go Up