Go Down

Topic: Protocollo su rs485 - consigli. (Read 1 time) previous topic - next topic

dab77

#10
Apr 28, 2012, 05:15 pm Last Edit: May 21, 2012, 11:12 am by dab77 Reason: 1
ok, dovrei aver capito dove sbagliavo..
Penso che sto facendo un pò troppe conversioni, però funziona.
posto i codici, se qualcuno ha voglia di dargli un'occhiata e correggermi..

Master:
Code: [Select]
#include "SoftwareSerial.h"

int EN_PIN = 4;
int LED_PIN = 13;
#define rxPin 2
#define txPin 3
int ind = 0;
char buf[8];
int dati[4][2];

SoftwareSerial rs485(rxPin, txPin);

void setup() {
  pinMode(EN_PIN, OUTPUT);
  Serial.begin(9600);
  rs485.begin(9600);
  pinMode (LED_PIN, OUTPUT);
}

void loop() {
  // inviare req(address '1' to '4', richiesta '5' to '8')
  req('1','5');
  delay(1);
  req('2','5');
  delay(1);
  req('3','5');
  delay(1);
  req('4','5');
  delay(1); 
}

void req(char addr, char reqType) {
  rs485.write(2);
  rs485.write(addr);
  rs485.write(reqType);
  rs485.write(addr+reqType);
  rs485.write(3);
 
  delay(50);  //Aspetta che risponde..
 
  if (rs485.available()>0) {
    if (rs485.read()==2) {
      for (int i=0; i<8; i++) {
        buf[i] = rs485.read();
      }
      ind = buf[0];
      if (ind == addr) {
        int sommaBytes = 0;
        for (int k=0;k<5;k++) {
          sommaBytes = sommaBytes + byte(buf[k]);
        }
        byte checksum = (buf[6] << 8 | buf[5]);           //////////// prima era: int checksum = (buf[6] << 8 | buf[5]);
                                              //////////// ma se buf[6] inizia per 1 checksum diventa negativo, e la comparazione con sommaBytes ritorna False.

        if ((buf[7]==3)&&(sommaBytes==checksum)) {
          Serial.println("Checksum and ETX ok!");
          ind = ind-48;
          Serial.print("Indirizzo : ");
          Serial.println(ind);
          Serial.println("SUM ok!");
          Serial.println("ETX ok!");
          Serial.print("Motore : ");
          Serial.println(ind);
          dati[ind][0] = (byte(buf[2]) << 8 | byte(buf[1]));
          dati[ind][1] = (byte(buf[4]) << 8 | byte(buf[3]));
          Serial.print("  Cella1 : ");
          Serial.println(dati[ind][0]);
          Serial.print("  Cella2 : ");
          Serial.println(dati[ind][1]);
        }
      }
    }
  }
}

..e uno degli Slave:
Code: [Select]
int EN_PIN = 4;
int LED_PIN = 13;
int cella1 = 1012;
int cella2 = 1003;
char addr = '1';
int reqType;
char buf[4];

void setup() {
  pinMode(EN_PIN, OUTPUT);
  Serial.begin(9600);
  Serial1.begin(9600);
  pinMode (LED_PIN, OUTPUT);
}

void loop() {
  while (Serial1.available()==0) {
    digitalWrite(LED_PIN, HIGH);
  }
  digitalWrite(LED_PIN, LOW);
  delay(10);
  if (Serial1.read()==2) {
    for (int i=0; i<4; i++) {
      buf[i] = Serial1.read();
    }
    Serial.print("Indirizzo : ");
    int ind = buf[0];
    Serial.println(char(ind));
    if (ind == addr) {
      Serial.print("Richiesta : ");
      reqType = buf[1];
      Serial.println(char(reqType));
      if ((buf[3]==3)&&(buf[0]+buf[1]==buf[2])) {
        Serial.println("SUM ok!");
        Serial.println("ETX ok!");
        if (reqType == '5') {
          invia();
        }
      }
    }
  }
}

void invia() {
  Serial1.write(2);
  Serial1.write(addr);
  Serial1.write(lowByte(cella1));
  Serial1.write(highByte(cella1));
  Serial.println("Valori celle:");
  Serial.println(lowByte(cella1));
  Serial.println(highByte(cella1));
  Serial1.write(lowByte(cella2));
  Serial1.write(highByte(cella2));
  Serial.println(lowByte(cella2));
  Serial.println(highByte(cella2));
  int checksum = (addr+lowByte(cella1)+highByte(cella1)+lowByte(cella2)+highByte(cella2));
  Serial.print("Checksum : ");
  Serial.println(checksum);
  Serial1.write(lowByte(checksum));
  Serial.println(lowByte(checksum));
  Serial1.write(highByte(checksum));
  Serial.println(highByte(checksum));
  Serial1.write(3);
}


Ovviamente ci sono ancora un sacco di Serial.print() per debuggare..

EDIT: lo scrivo solo se a qualcuno viene in mente di prendere spunto da questo codice, che c'è un piccolo errore. l'ho corretto e ho segnato il punto.
in più i delay sono da regolare a seconda della velocità di trasmissione. Quindi il codice così com'è non è affidabile al 100%.

Davide.

Go Up