Go Down

Topic: Problemi con l'interpretazione dei caratteri tra seriale PC e Arduino. (Read 2185 times) previous topic - next topic

Zezerich

Buongiorno a tutti, ho un problema con la trasmissione seriale di un computer con interfaccia utente c#.

Collegamento RX TX sulla scheda Arduino Pin 2-3 lato PC, Pin 5 ground.

Collegando il SW c# alla porta (USB 19) di arduino i caratteri sono trasmessi regolarmente e nel formato corretto, riesco ad accendere led, motori, tutto funziona perfettamente.
Nel buffer di ricezione del c# (Com 1) riesco a vedere i caratteri sotto forma di stringa o sotto forma di decimale (modalità debbugging) e non combaciano con quelli trasmessi. Esempio il LED 13 si accende se riceve il comando e e e , per far questo sulla tastiera del computer devo digitare      5 5 5..
Lo scopo di base non è comunicare direttamente tra PC e arduino ma tramite modulo XBee....
Dunque il mio problema potrebbe non sussistere all'origine nel caso in cui i moduli Xbee usino la stessa Com (USB cosa che non penso) di arduino oppure un diverso formato di trasmissione dati non collegato ai Pin RX TX. di Arduino. Premetto che non posso usare i Pin 10-11 perchè utilizzati per gestire altri due servo motori.

Riassumendo  avrei bisogno di sapere
-come lavora il modulo XBee (Prima di ordinarlo) oppure
-Dove potrebbe essere l'errore che sto facendo nell'interpretazione dei caratteri oppure nell ' invio di tali.

Faccio un' altra piccola premessa, questo tipo di comunicazione seriale in c# non è la prima volta che la uso con altre utenze (es centraline motori diesel con protocollo proprietario) e funziona correttamente.

Ringrazio tutti anticipatamente per l'aiuto.

gpb01


Buongiorno a tutti, ho un problema con la trasmissione seriale di un computer con interfaccia utente c#.

Collegamento RX TX sulla scheda Arduino Pin 2-3 lato PC, Pin 5 ground.
....


Scusa ... non ho capito ... tu stai collegando DIRETTAMENTE i pin TX e RX di Arduino alla seriale del PC ???  :smiley-eek: :smiley-eek: :smiley-eek:

Così hai solo la probabilità di bruciare Arduino e null'altro ... Arduino lavora a livelli TTL, la seriale del PC è una RS232 con tensioni che possono raggiungere i +12/-12 V. !!!  Se vuoi collegare i due oggetti tra di loro, devi usare un adattatore di livelli, tipo il MAX232 !!!

Guglielmo
Search is Your friend ... or I am Your enemy !

Zezerich

Buonasera e grazie per la risposta.
Non proprio direttamente alla seriale ma c'è un convertitore nel mezzo con due porte seriali, la tensione di uscita è 5,5 - 6V stabilizzata, è un convertitore industriale/Commerciale collegato ai pin 2-3-5 della seriale del PC. funzionante e testato in migliaia si impianti in tutto il mondo.
Pensi che un volt volt in più possa avere danneggiato la scheda?
Oppure sopra i 5 volts non interpreta più il segnale?
Qualcosa di strano sicuramente c'è..... e credo sia a livello HW non a livello SW.
Se per fare una prova metto due resistenze si può danneggiare? (Partitore di tensione?).
In ogni caso se si lavora con moduli XBee si possono usare i Pin 0,1 di Arduino e una seriale esterna oppure si deve usare necessariamente il monitor seriale?

gpb01

Buonasera,
se guardi il datasheet del ATmega328P vedrai che da come tensione massima su qualsiasi pin (escluso il pin di reset) da -0.5V a VCC+0.5V quindi, almeno in teoria, qualsiasi cosa sopra i 5.5v (se lo alimenti a 5v) potrebbe danneggiarlo ...  :smiley-roll:

Relativamente ai pin per la seriale, dando per scontato che sei su un Arduino UNO (visto che con la Arduino Mega avresti altre 2 porte seriali), io ti consiglio di lasciare liberi i pin 0 e 1, che sono sempre utili per fare debug (... via monitor seriale), ed usarne per il collegamento con il modulo Xbee un altra coppia di pin che gestirai tramite la SoftwareSerial ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

nid69ita

Forse dico una fesseria, ma non basta dichiarare per la comunicazione il baude rate ad esempio a 9600.
Quando apri la porta in C# come setti i parametri , 8bit, no-paritá, 1 bit stop

http://forum.arduino.cc/index.php?topic=67233.0
my name is IGOR, not AIGOR

Zezerich

Le ho provate tutte..... è la prima cosa che ho pensato, infatti generalmente quando si hanno dei caratteri strani o sono rovesciati i due fili oppure la baudrate è impostata male. i bit nella software c # sono impostati come devono essere...... infatti si collego lo stesso SW lo stesso arduino alla porta COM 19 (USB arduino) il Software funziona al 1000% non sbaglia un colpo.
Per questo credo il peoblema sia della serial di per se. sono due giorni che leggo post e argomenti correlati, ma non trovo soluzione . se utilizzo hyper terminal o simili ottengo lo stesso risultato, escludo ogni possibilità lato SW. anche perchè se io imposto nel SW Arduino :
Q = Serial.read();
     Serial.write(Serial.println(Q));
      delay(100);     
        c[cont] = Q;
        cont++;
    if ((c[0] == 'e' ) & (c[1] == 'e') & (c[2] == 'e'))
      {   
      digitalWrite(13,HIGH);       
      }
   
      else
      {
        //if ((c[0] == '1' ) & (c[1] == '0') & (c[2] == '0'))
      digitalWrite(13,LOW);
      }
     if (cont >2)
      {
      cont =0;       
      }

Digito 555 sul terminale che sia interfaccia C# oppure Hyperterminal il Led si accende ma nel buffer di ritorno sulla COM 1 o 23 o 24 che sia leggo MMM. e questo per ogni lettera che invio ottengo caratteri traslati sempre con la stessa costanza.

gpb01

Un paio di cose,
primo, cortesemente racchiudi sempre il codice dentro gli appositi TAG "code" (in edit usa il bottone # , terzultimo della seconda fila);
secondo, una Serial.read() NON preceduta da un "if ( Serial.available() ) { ... }" è sempre fonte di guai ...
... leggere dalla seriale quando non ci sono dati disponibili ... non è buona cosa ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Zezerich

Buongiorno a tutti,
si effettivamente era solo una piccola parte del codice..... qui sotto è riportato l'intero codice modificato per poterlo far funzionare con i Pin 10 11.
Così com'è funzionava quasi correttamente eccetto per il fatto che accettava in ingresso solo un carattere alla volta mentre tramite usb il processo era automatico. veniva diviso in tre linee direttamente dal SW.
Il problema è sempre lo stesso per quanto riguarda i Pin RX TX. non trasmette niente e credo di essere costretto ad usarli per necessità.
(Il codice non è completo perchè è troppo lungo e non lo fà postare tutto)
- Come si attivano quei Pin?

Code: [Select]

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10,11);// RX, TX
#include <Servo.h>
#include <elapsedMillis.h>

elapsedMillis timeElapsed;
Servo ail;
Servo ele;
Servo thr;
Servo rudd;
int c[8] = {0,0,0,0,0,0,0,0};
int cont = 0;

unsigned int interval = 10000;
void setup()
{
 mySerial.begin(9600); // Abilito l'ascolto dei comandi tramite seriale
 delay(50);
 Serial.begin(9600);
 ail.attach(3); // AIL
 ele.attach(5); // ELE
 thr.attach(9); // THR
 rudd.attach(11); // RUDD
 pinMode(2,OUTPUT);
 pinMode(13,OUTPUT);
 sail('00');
 sele('50');
 sthr('50');
 srudd('50');
}

void sail(int speed)
{
 int angle = map(speed, 0, 100, 0, 180);
 ail.write(angle);
}

void sele(int speed){
 int angle = map(speed, 0, 100, 0, 180);
 ele.write(angle);
}

void sthr(int speed){
 int angle = map(speed, 0, 100, 0, 180);
 thr.write(angle);
}

void srudd(int speed){
 int angle = map(speed, 0, 100, 0, 180);
 rudd.write(angle);
}
int Q=0;
int F=0;
void loop() // Inizio Loop
{
 int speed;  
 if (mySerial.available() > 0)
 //if (Serial.available() > 0)
 {    
    Q = mySerial.read(); // Creo una variabile chiamata Comando
    delay(50);
    //F = Serial.read();
    //delay(50);
    mySerial.write(Q);  
    //delay(50);  
    //Serial.write(F);
     //delay(100);
      if (Q!=13)
      {      
       c[cont] = Q;
       cont++;
      }
      if (cont >2)
     {
     cont =0;      
     }
      mySerial.println(Q);
      //Serial.println(F);
   if ((c[0] == 'e' ) & (c[1] == 'e') & (c[2] == 'e'))
     {    
     digitalWrite(13,HIGH);      
     }
   
     else
     {
       //if ((c[0] == '1' ) & (c[1] == '0') & (c[2] == '0'))
     digitalWrite(13,LOW);
     }
   
   // Se comando è uguale ad 1
//Serial.print ("comando=");
 //Serial.println(c[cont]);
 //Serial.println (speed);
 //delay(1000);    
   // Ripristino Comunicazione.
   timeElapsed = 0;
   if ((c[0] == '7') & (c[1] == '0') & (c[2] == '0'))
   {
     digitalWrite(2,LOW);
     timeElapsed =0;
   }    
   //Scrivo Dati su seriale
  // AIL
  //-----------------------------------------------------------------------------------------
  if ((c[0] =='1') & (c[1] == '0') & (c[2] == '0')) {  sail(0) ; Serial.println("100"); delay(200); }

// Fine Loop

gpb01

Non ho capito la domanda ... quali pin vuoi "attivare" ???  :smiley-eek:

Solo un dubbio ...
... naturalmente ti sei ricordato di incrociare RX e TX vero ??? Ovvero RX Arduino <--- TX PC  ;  TX Arduino ---> RX PC ... e ... altrettanto naturalmente ti sei ricordato anche di collegare la massa di Arduino alla massa del PC ?  Hai verificato che le masse siano effettivamente in comune (basta il tester)  ?

Perché, se i collegamenti sono fatti bene e la velocità della seriale è quella giusta ... la SoftwareSerial DEVE funzionare ... e cosa ultra collaudata  XD

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up