ti puo essere utile?
//------------------------------------------------------
/*
- File: RS485.h
- Author: andrea ivetich
- andrea.ivetich@alice.it
-
- Created on 26 ottobre 2010, 11.55
*/
#include <inttypes.h>
#include "HardwareSerial.h"
/*
usare con integrato 8 piedini MAX485
con arduino mega si possono utilizzare 4 integrati MAX485
collegare come segue:
arduino MAX488
busy_pin <--> RE(2) e DE(3) in corto
RX <--> RO(1)
TX <--> DI(4)
5v <--> VCC(8)
GND <--> GND(5)
rete 485 MAX485
linea_485_A <--> A(6)
linea_485_B <--> B(7)
definire il metodo flush virtuale... cosi:
nella file HardwareSerial.h aggiungere la parola virtual..
in modo da avere
virtual void flush(void);
e aggiungere la seguenti righe i modo da poter "overloadare" la classe
extern ring_buffer rx_buffer;
#if defined(AVR_ATmega1280)
extern ring_buffer rx_buffer1;
extern ring_buffer rx_buffer2;
extern ring_buffer rx_buffer3;
#endif
*/
#define RS485Port_busy_pin_0 2
#define RS485Port_busy_pin_1 21
#define RS485Port_busy_pin_2 4
#define RS485Port_busy_pin_3 6
class RS485Port : public HardwareSerial {
public:
RS485Port(ring_buffer *rx_buffer,
volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
volatile uint8_t *udr,
uint8_t rxen,
uint8_t txen,
uint8_t rxcie,
uint8_t udre,
uint8_t u2x,
int busy_pin);
void begin(long);
void flush(void);
private:
int bp;
};
/*
extern RS485Port Serilal_485;
#if defined(AVR_ATmega1280)
extern RS485Port Serial1_485;
extern RS485Port Serial2_485;
extern RS485Port Serial3_485;
#endif
*/
//---------------------------------------------
/*
- File: RS485.cpp
- Author: andrea ivetich
- andrea.ivetich@alice.it
-
- Created on 26 ottobre 2010, 11.55
*/
#include <stdlib.h>
#include "wiring.h"
#include "RS485.h"
RS485Port::RS485Port(
ring_buffer *rx_buffer,
volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
volatile uint8_t *udr,
uint8_t rxen,
uint8_t txen,
uint8_t rxcie,
uint8_t udre,
uint8_t u2x,
int busy_pin)
: HardwareSerial(rx_buffer, ubrrh, ubrrl, ucsra, ucsrb, udr, rxen, txen, rxcie, udre, u2x) {
bp = busy_pin;
}
void RS485Port::begin(long b) {
HardwareSerial::begin(b);
pinMode(bp, OUTPUT);
digitalWrite(bp, LOW);
}
void RS485Port::flush(){
digitalWrite(bp, HIGH);
HardwareSerial::flush();
delay(30);
digitalWrite(bp, LOW);
}
/*
#if defined(AVR_ATmega8)
RS485Port Serial_485(&rx_buffer, &UBRRH, &UBRRL, &UCSRA, &UCSRB, &UDR, RXEN, TXEN, RXCIE, UDRE, U2X, RS485Port_busy_pin_0);
#else
RS485Port Serial_485(&rx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRE0, U2X0, RS485Port_busy_pin_0);
#endif
#if defined(AVR_ATmega1280)
RS485Port Serial1_485(&rx_buffer1, &UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UDR1, RXEN1, TXEN1, RXCIE1, UDRE1, U2X1, RS485Port_busy_pin_1);
RS485Port Serial2_485(&rx_buffer2, &UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UDR2, RXEN2, TXEN2, RXCIE2, UDRE2, U2X2, RS485Port_busy_pin_2);
RS485Port Serial3_485(&rx_buffer3, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UDR3, RXEN3, TXEN3, RXCIE3, UDRE3, U2X3, RS485Port_busy_pin_3);
#endif
*/
Ciao?