Analisi protocollo seriale RS232 con scheda Arduino

Uso della UART del controllore

Caricare il programma su Arduino (il segnale su Pin 2 serve per indicare  l'inizio dell'invio del byte: sincronizzare l'oscilloscopio su questo per ottenere un visione stabile della trama.)
Collegare CH1 dell'oscilloscopio al PIN 2 di Arduino e CH2 al PIN TX

void setup() {
   Serial.begin(9600);
   pinMode(2,OUTPUT);
}
void loop() {
  digitalWrite(2,HIGH);
  Serial.write( B01010101);
  digitalWrite(2,LOW);
  delay(2);
}
Il Arduino trasmetterą ripetutamente via seriale il byte 01010101 ad intervalli di 2  mS, analizzare con l'oscilloscopio il segnale TX:
  1. Identificare il bit di start

  2. Identificare il dato seriale trasmesso

  3. Identificare il bit di stop

  4. Misurare il tempo di bit e ricavare la velocitą di trasferimento in bps

  5. Caricando e lanciando i programmi sotto elencati analizzare su oscilloscopio il comportamento del bit paritą nelle diverse casistiche di configurazione.

Parita Even

void setup() {
   Serial.begin(9600,SERIAL_8E1);
   pinMode(2,OUTPUT);
}

void loop() {
  digitalWrite(2,HIGH);
  Serial.write( B01010101);
  digitalWrite(2,LOW);
  delay(2);
}
 

Parita Odd

void setup() {
   Serial.begin(9600,SERIAL_8O1);
   pinMode(2,OUTPUT);
}

void loop() {
  digitalWrite(2,HIGH);
  Serial.write( B01010101);
  digitalWrite(2,LOW);
  delay(2);
}
 

Parita Even

void setup() {
   Serial.begin(9600,SERIAL_8E1);
   pinMode(2,OUTPUT);
}

void loop() {
  digitalWrite(2,HIGH);
  Serial.write( B00010101);
  digitalWrite(2,LOW);
  delay(2);
}

Parita Odd

void setup() {
   Serial.begin(9600,SERIAL_8O1);
   pinMode(2,OUTPUT);
}

void loop() {
  digitalWrite(2,HIGH);
  Serial.write( B00010101);
  digitalWrite(2,LOW);
  delay(2);
}

 

Uso della libreria SoftwareSerial

9600 b/s no parity e 1 stop bit

  1. Verificare con oscilloscopio se il protocollo viene rispettato
#include <SoftwareSerial.h>
#define rxPin 10
#define txPin 11
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
void setup()  {
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(2, OUTPUT);
  digitalWrite(2,LOW);  
  mySerial.begin(9600);
}
void loop() {
  digitalWrite(2,HIGH);
  mySerial.write(B01010101);
  digitalWrite(2,LOW);  
  delay(2);
}

Test comunicazione tra schede

  1. Prendere due schede Arduino collegare il Pin 10 di una scheda con Pin 11 dell'altra e viceversa.
  2. Caricare e lanciare il programma nelle due schede.
  3. Aprire il monitor seriale e verificare l'output: le due schede si dovrebbero scambiare i valori di tensione letti nei rispettivi canali di ingresso analogici.
  4. Monitorare i segnali con l'oscilloscopio.
#include <SoftwareSerial.h>
#define rxPin 10
#define txPin 11
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
void setup()  {
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(2, OUTPUT);
  digitalWrite(2,LOW);  
  mySerial.begin(9600);
  Serial.begin(9600);
}
void loop() {
  int n;
  char c;
  while (mySerial.available())
  {
    c=mySerial.read();
    Serial.write(c);  
  }    
  digitalWrite(2,HIGH);    
  for (n=0;n<6;n++)
  {
    mySerial.print(n);
    mySerial.print(":");
    mySerial.print(analogRead(n)*5.0/1023);
    mySerial.print(" ");
  }   
  mySerial.println("");
  digitalWrite(2,LOW);    
  //delay(100);
}