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)?
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
É 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:
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...
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]