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