Pages: [1]   Go Down
Author Topic: Comunicação Serial "simultânea" não funcionando no Arduino Mega  (Read 1582 times)
0 Members and 1 Guest are viewing this topic.
Curitiba PR, Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 259
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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!
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3244
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Curitiba PR, Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 259
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :/
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3244
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

É 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()?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Curitiba PR, Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 259
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
É 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:
Code:
#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 ?
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3244
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Curitiba PR, Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 259
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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:
Code:
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?
« Last Edit: January 25, 2012, 07:34:17 am by Osias Neto » Logged

Curitiba PR, Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 259
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

De qualquer forma, obrigado pela ajuda smiley
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3244
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Na comunicação I2C funciona sem pull up, só é necessário se houver ruídos etc.

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".

Se eu precisar trocar a porta de Serial1 para Serial3 por exemplo, só precisarei alterar uma linha...

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.
 


Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Brasil
Offline Offline
Sr. Member
****
Karma: 2
Posts: 315
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...

http://arduino.cc/en/Serial/Begin

[errata] realmente, o MEGA tem 4 UART e não 3, desculpe. [/errata]
« Last Edit: January 26, 2012, 01:00:49 am by mmoscz » Logged

4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP


Pages: [1]   Go Up
Jump to: