[Risolto] HC-05: Serial.available() dà true, Serial.read() legge solo 255

Sto usando un HC-05 che durante i primi tentativi funzionava correttamente. Da quando ho usato la modalità AT ha cominciato a dare di matto, pur associandosi/connettendosi come si deve al mio dispositivo. Serial.avaiable() sembra andare comunque.
In input ricevo sempre 255, 241 252 o simili.
In output stampo correttamente solo sul monitor seriale dell’IDE (che comunque non riesce a convertire gli input in char perchè fuori range).
Ecco il codice (prima di usare la AT andava tutto):

/*
   Program: led al bluetooth
   Date: 31/08/2019
   Author: Stefano Volpe IV Bsa
*/

#include <SoftwareSerial.h>

// Pin
constexpr int led { 2 }, HC_05_RX { 10 }, HC_05_TX { 11 };

// Velocità seriali
constexpr long speed { 9600 }; 

// HC_05
SoftwareSerial HC_05(HC_05_RX, HC_05_TX);
constexpr char HC_05_off { '0' }, HC_05_on { '1' };

void setup() {
  pinMode(led, OUTPUT);
  Serial.begin(speed);
  HC_05.begin(speed);
  Serial.println("Setup completato con successo.");  
}

void loop() {
  if (HC_05.available()) {
    char input { HC_05.read() };
    Serial.print("Input: ");
    Serial.print(input);
    switch (input) {
      case HC_05_off:
        digitalWrite(led, LOW);
        break;
      case HC_05_on:
        digitalWrite(led, HIGH);
        break;
      default:
        Serial.print(" (non riconosciuto)");
    }
    Serial.println();
  }
}

Grazie in anticipo!

>FoxySeta: in conformità al REGOLAMENTO, punto 13, il cross-posting è proibito (anche tra lingue diverse) per cui, il tuo post duplicato nella sezione Inglese del forum (post scritto successivamente a questo) è stato cancellato. Per il futuro, ti prego di evitare di aprire più post sullo stesso argomento in sezioni differenti del forum.

Detto questo, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Prima di tutto un consiglio … lascia LIBERA la Serial (ti serve per fare debug) e crea una seriale virtuale su altri due pin (consigliato 10 RX e 11 TX) con la libreria SoftwareSerial (libreria di base presente in Arduino).

In questo modo avrai una seriale per il tuo HC-05 (la SoftwareSerial) ed una (la Serial) da usare assieme al monitor seriale per avere informazioni di debug.

Oltretutto, se fai un po’ di ricerche qui sul forum, in svariati casi gli HC-05 NON funzionano bene (non comunicano) con la veria seriale hardware (Serial), mentre non hanno alcun problema con la seriale viruale creata con la SoftwareSerial.

Guglielmo

gpb01:
Prima di tutto un consiglio ... lascia LIBERA la Serial (ti serve per fare debug) e crea una seriale virtuale su altri due pin (consigliato 10 RX e 11 TX) con la libreria SoftwareSerial (libreria di base presente in Arduino).

In questo modo avrai una seriale per il tuo HC-05 (la SoftwareSerial) ed una (la Serial) da usare assieme al monitor seriale per avere informazioni di debug.

Ok. Ho sostituito il codice nel post originale (dovrebbe essere giusto :sweat_smile: ).

gpb01:
Oltretutto, se fai un po' di ricerche qui sul forum, in svariati casi gli HC-05 NON funzionano bene (non comunicano) con la veria seriale hardware (Serial), mentre non hanno alcun problema con la seriale viruale creata con la SoftwareSerial.

Il risultato è quello di prima (anche perchè quando ho iniziato ad usarlo andava pure con la seriale dei pin 0 e 1).

EDIT: potrei aver pastrocchiato qualcosa in modalità AT che neanche un AT+RESET/AT+ORGL sia in grado di sistemare?

Guarda prova questo semplicissimo programmino di “echo” (usato mille volte e di sicuro funzionamento) … che ha la possibilità di essere utilizzato sia in “AT mode” (Command mode a 38400) che in “echo mode” (trasparente a 9600).

// *****************************************************
//
//        Bluetooth module serial communication
//              Bluetooth <--> USB_Serial
//
// *****************************************************

#include <SoftwareSerial.h>

// #define  BT_CONTROLMODE      // Uncomment if you set the KEY pin to HIGH (Control mode)

#define  BT_RX 10            // PIN to receive from bluetooth
#define  BT_TX 11            // PIN TO transmit to bluetooth

SoftwareSerial btSerial(BT_RX, BT_TX);

void setup()
{
  delay (2000);
  //
  Serial.begin(9600);        // Initialize USB Serial port
  //
  #ifdef BT_CONTROLMODE
    btSerial.begin(38400);   // Initialize Bluetooth SoftwareSerial port for default control speed
  #else
    btSerial.begin(9600);    // Initialize Bluetooth SoftwareSerial port for selected data speed
  #endif
  //
  Serial.println("--- Ports ready ---");
  Serial.println("");
  //
  #ifdef BT_CONTROLMODE
    delay(1000);  
    btSerial.print("AT");
    btSerial.print("\r\n");
  #endif
}

void loop()
{
  if (btSerial.available() > 0) Serial.write(btSerial.read());
  if (Serial.available() > 0) btSerial.write(Serial.read());
}

… apri il monitor seriale, connetti il BT ad un emulatore di terminale sul telefono, quello che scrivi sul telefono lo devi vedere sul monitor seriale e viceversa.

Guglielmo

Come prima :confused:
La trasmissione dei dati all’emulatore sul telefono sembra non avvenire proprio, e quello che mando al monitor seriale sul pc non viene letto come si deve:

12:41:17.776 -> --- Ports ready ---
12:41:17.776 -> 
12:42:14.959 -> ⸮⸮n^⸮

Non è assolutamente un problema di codice, ma ho ricontrollato pure i pin per sicurezza e sembrano a posto.
Alimentazione:

  • 5V (Arduino) → VCC (HC-05)
  • GND (HC-05) → GND (Arduino)

Seriale:

  • digital 11 (Arduino) ->RX (HC-05)
  • TX (HC-05) → digital 10 (Arduino)

In AT mode sembra funzionare tutto invece: inserisco da monitor seriale i comandi e ricevo OK.

Sicuro della velocità ? ? ? da quello che vedo sembrerebbe un problema di velocità di colloquio che forse hai modificato dai 9600 di default ...

Con l'apposito comando AT reimposta la seriale a 9600 bps ...

Guglielmo

Woah, hai ragione kudos :grinning:
Soluzione: usando ALT+ORGL in passato la velocità di colloquio era andata a 38400 baud. Riportandola a 9600 baud va di nuovo tutto.

Segno la conversazione come risolta.

FoxySeta:
Woah, hai ragione kudos :grinning:

:smiley: :smiley: :smiley: … sono contento che hai trovato il problema ed hai potuto risolverlo :wink:

Guglielmo