Go Down

Topic: Problema Serial/Serial1 su Arduino mega 2560 (Read 762 times) previous topic - next topic

asamlink

Salve a tutti,

Recentemente ho avuto un problema nella gestione delle seriali sull'arduino mega 2560 rev.3.
IDE di sviluppo 1.0.1.
Il quadro e' questo: la seriale principale e' collegata al PC. La serial1 e' collegata ad un chip max488, che e' connessa ad un dispositivo.
E' anche collegato uno shield ETH in rev. 3.
Il funzionamento normale, prevede il controllo dissociato tra le seriali. Infatti la serial serve solo come configuratore (alla terminal) del dispositivo. A regime il dispositivo e' collegato su serial1 e scambia le informazioni tra serial/eth (cioe' ho un incapsulamento del protocollo seriale su eth).
Fin qui tutto bene.
Il problema avviene quando, per check up, ho voluto verificare quali fossero le informazioni della Serial1. Per fare questo, on the fly (cioe' velocemente) ho precaricato questo:
Code: [Select]

void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop()
{
  while(Serial1.available())
    Serial.write(Serial1.read());

  while(Serial.available())
    Serial1.write(Serial.read());
}

E sono incomanciati i problemi. Soprattutto sulla ricezione dalla serial1. Cioe' vengono troncate le informazioni. Non contento, ho insistito con un codice poco piu' evoluto:
Code: [Select]

void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop()
{
  if(Serial.available())
  {
    Serial.println();
    Serial.println("---------------------");
    Serial.print("Receive: ");

    byte toRcv = Serial.read();
   
    Serial.print(toRcv,DEC);
    Serial.println("");
   
    while(Serial.available())
    {
      Serial1.write(Serial.read());
      //delay(3);
    }
   
    int av;
    delay(25);
    do
    {
      av = Serial1.available();
      Serial.println(av,DEC);
      delay(1000);
    }while(av<toRcv);
   
    Serial.print("RCV:");
   
    for(int c = 0; c < toRcv; c++)
    {
      Serial.print(Serial1.read(),HEX);
      Serial.print(';');
    }
     
    Serial.println();
    Serial.println("Flushing:");
    while(Serial1.available())
    {
      Serial.print(Serial1.read(),HEX);
      Serial.print(';');
    }
  }
}

In questo, invio l'ammotare atteso di byte su serial1. Ma anche qui ho diversi problemi, a volte non ho nemmeno dati dalla Serial1.
Non riesco proprio a capire. Grazie a tutti.

asamlink

Salve a tutti,

Sto continuando ad effettuare dei test. Ho scoperto che se uso il circuito collegato al PC (su Serial ovviamente) ho dei problemi di ricezione su Serial1.

Ho scollegato la Serial (USB) dal PC e continuato ad eseguire i test, e tutto funziona. Ovviamente ho riscritto il codice per l'eth e ho preparato un programma che comunica su tcp/ip. Lo scketch che sta girando e':
Code: [Select]

#include <Arduino.h>
#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EEPROM.h>
#include <Wire.h>

/************ ETHERNET STUFF ************/
void setup();
void loop();
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0B, 0x00, 0x88 };
IPAddress ip(192,168,30,177);
IPAddress ipServer(192,168,30,115);
EthernetServer server(1717);
EthernetClient client;
EthernetClient cServer;

byte rcv[100];

void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();
  Serial1.begin(9600);
  //Serial.begin(9600);
}

void loop()
{
 
  cServer = server.available();
  if(cServer.connected() && cServer.available())
  {
    //Ricevo: B0,Bdata -> B0: total data to receive, Bdata data to send serial1
    byte len = cServer.read();
    for(byte c = 0; c<len; c++)
    {
      while(!cServer.available()) delay(10);
     
      rcv[c] = cServer.read();
    }
   
   
   
    for(byte c = 0; c<len; c++)
      Serial1.write(rcv[c]);

//    Serial.println("Receive data:");
//    for(byte c = 0; c<len; c++)
//    {
//      Serial.print(rcv[c],HEX);
//      Serial.print("; ");
//    }
//    Serial.println();
   
  }
 
  delay(25);
 
  if(Serial1.available())
  {
    int oldav,newav;
    do
    {
      oldav = Serial1.available();
     
      delay(100);
     
      newav = Serial1.available();
    }while(oldav!=newav);
   
    if(client.connect(ipServer, 1717))
    {
      for (int c = 0; c< newav;c++)
        client.write(Serial1.read());
       
      client.flush();
      client.stop();
    }

    //Serial1 purged
    while(Serial1.available())
    {
      Serial1.read();
      delay(20);
    }
  }
}

A questo punto posso desumere che ci possa essere qualche conflitto Hardware. Mah! :~

mauroz

non so aiutarti nel tuo problema, ti volevo chiedere lo schema con cui hai connesso il 488 al mega o 328, ci avevo provato qualche tempo fa per dei test ma senza riuscire a veder niente nella seriale e penso che di aver  sbagliato qualcosa. Con dei 485 invece nessun problema...

asamlink


non so aiutarti nel tuo problema, ti volevo chiedere lo schema con cui hai connesso il 488 al mega o 328...


Ciao,
ti posto lo schema fritzing.

Non ho usato le resistenze tra A, B e Y, Z perche' la distanza non e' elevata e comunque ho lo una coppia.
Il tutto gira a 9600 bps (non ho provato a velocita' piu' elevate, in quanto il dispositivo remoto non va oltre e non lo programmo io).

Cosi' a me funziona tutto correttamente, se hai dubbi e posso aiutarti, ben volentieri.

mauroz

grazie mille, se domani ho un po' di tempo ci provo e poi ti dico...  :)


Go Up