Comunicação Serial "simultânea" não funcionando no Arduino Mega

Olá, por acaso alguém já tentou usar todas as Seriais (0, 1, 2 e 3) ao mesmo tempo, e ainda com a I2C e PWM no mesmo código?

Eu tenho um código que não está funcionando a comunicação Serial, queria saber se alguém pode me ajudar a eliminar as possibilidades...

O código é um bocado grande, mas em resumo, em um dado momento eu estou enviando dados via I2C, e esperando uma resposta via a Serial2, porém, mesmo eu verificando que os dados estão chegando (com um osciloscópio), o software continua a enviar dados I2C (ou seja, não travou) mas Serial2.available continua a retornar sempre zero...

Seria algo do tipo:

void setup()
{
   Serial.begin(9600); // PC
   Serial1.begin(1200); // Flex Led
   Serial2.begin(1200); // FL do BMV que testa o BMC
   Serial3.begin(1200); // FL do BMC que testa o BMV
   
   Wire.begin(); // entra como mestre i2c

  analogWrite(5, 100);
}

void loop
{
      Wire.beginTransmission(9);
      Wire.write('a');
      Wire.endTransmission();

      Wire.beginTransmission(10);
      Wire.write('b');
      Wire.endTransmission();
      
      if (Serial2.available()>0) Serial.print( Serial2.read());
      if (Serial3.available()>0) Serial.print( Serial3.read());
      if (Serial1.available()>0) Serial.print( Serial1.read());
 }

Alguém sabe algum problema de compatibilidade por tantas comunicações simultâneas, ou pode ser algum problema de RAM (o software completo é bem grande)?

Qualquer palpite é bem vindo!

eu acho que o grande problema é estares a usar librarias... a maior parte delas usa funcões bloqueantes, logo cada vez que usas uma comunicacão, não existe maneira de saber o que se passa nos outros canais.

Bom, eu estou usando Wire, alguém sabe se esta lib causa algum problema usando-a simultaneamente com as 4 seriais (usart)?

Afinal, as seriais deveriam ser assíncronas não? Quero dizer, não importa em que parte do software eu estou, se está chegando alguma coisa, isto é armazenado em Buffer... mas não é isso que está acontecendo :confused:

É armazenado em buffer... de um byte no caso das interrupções estarem desactivadas. Já experimentaste abrir a lib do OneWire e ver se existe por lá umas instruções sei() e cli()?

É armazenado em buffer... de um byte no caso das interrupções estarem desactivadas. Já experimentaste abrir a lib do OneWire e ver se existe por lá umas instruções sei() e cli()?

Não, não existe nenhuma das duas na lib do Wire

Lembrei de uma coisa, eu posso usar o define para variaveis e funções certo?
Por exemplo eu posso fazer:

#define START_SERIAL Serial.begin(9600)
#define LIMPA_SERIAL Serial.flush()

É possível usar também para objetos?
Eu posso fazer #define com_rede Serial2 ?

Podes... mas isso é uma má prática de programação. Custa muito escrever Serial.flush()??

Podes... mas isso é uma má prática de programação. Custa muito escrever Serial.flush()??

Se eu precisar trocar a porta de Serial1 para Serial3 por exemplo, só precisarei alterar uma linha... O software completo usa outras vezes as seriais,
este código que postei, é na verdade uma função chamada para testar as seriais, eu a coloquei dentro de um while e quando eu aperto um botão ele sai da função normalmente,
ou seja, não trava. Porém a comunicação serial não funciona em nenhum ponto do software, apenas a I2C, SPI e PWM estão normais...

Acabei de testar o seguinte:

if (Serial2.available()>0)
{
   Serial.print( Serial2.read());
   Serial.print("c");
}

else
{
   Serial.print("a");
   Serial2.print("b");
}

Não imprime nada no serial monitor, a função "Serial.print" também parece não estar funcionando!

Alguma ideia?

Descobri... eu não sabia que é necessário pull ups nessas linhas :stuck_out_tongue:
Na comunicação I2C funciona sem pull up, só é necessário se houver ruídos etc.

De qualquer forma, obrigado pela ajuda :slight_smile:

Errado, a comunicacão I2C não funciona sem pull ups. A libraria do Arduino activa os pull ups internos e faz com que tudo funcione "magicamente".

Ahhh, que giro... só precisas de alterar uma linha? Eu vi duas no teu exemplo... e nem sequer tinhas as funcões para ler e escrever. Essas também têm de ser mudadas, ou não? O que estou a tentar dizer é que na tentativa de "poupar trabalho", vais arranjar ainda mais problemas. Não vale a pena e é uma má prática.

Não te confundiste com as portas série? Vejo para aí imensas portas série e não sei se inicializaste todas ou alguma.

Não há "serial" no arduino mega, apenas serial1, serial2, serial3
Se bem lembro, no arduino mega, há 3 UART e não 4 para existir serial. serial1. serial2. serial3
Talvez esse seja o problema, está a tentar receber dados de uma serial que não existe...

[errata] realmente, o MEGA tem 4 UART e não 3, desculpe. [/errata]