Forum - Sistemi integrati
- problema slave master rs485 arduino
alex1995 (Normal User)
Expert
Messaggi: 294
Iscritto: 27/01/2011
salve, sto cercando di fare comunicare 2 arduino con l' rs485 questo č il mio sorgente:
master:
Codice sorgente - presumibilmente C++
#include <SoftwareSerial.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX 10 //Serial Receive pin
#define SSerialTX 11 //Serial Transmit pin
#define SSerialTxControl 3 //RS485 Direction control
#define RS485Transmit HIGH
#define RS485Receive LOW
#define Pin13LED 13
SoftwareSerial RS485Serial( SSerialRX, SSerialTX) ; // RX, TX
int byteReceived;
int byteSend;
void setup( )
{
Serial.begin ( 9600) ;
Serial.println ( "YourDuino.com SoftwareSerial remote loop example" ) ;
Serial.println ( "Use Serial Monitor, type in upper window, ENTER" ) ;
pinMode( Pin13LED, OUTPUT) ;
pinMode( SSerialTxControl, OUTPUT) ;
digitalWrite( SSerialTxControl, RS485Receive) ;
RS485Serial.begin ( 127000) ;
}
void loop( )
{
digitalWrite( Pin13LED, HIGH) ;
if ( Serial.available ( ) )
{
byteReceived = Serial.read ( ) ;
if ( byteReceived == 48)
{
digitalWrite( SSerialTxControl, RS485Transmit) ;
RS485Serial.write ( 48) ;
digitalWrite( Pin13LED, LOW) ;
delay( 10) ;
RS485Serial.write ( 49) ;
digitalWrite( Pin13LED, LOW) ;
delay( 10) ;
RS485Serial.write ( 50) ;
digitalWrite( Pin13LED, LOW) ;
delay( 10) ;
RS485Serial.write ( 51) ;
digitalWrite( Pin13LED, LOW) ;
delay( 10) ;
RS485Serial.write ( 52) ;
digitalWrite( Pin13LED, LOW) ;
delay( 10) ;
RS485Serial.write ( 53) ;
digitalWrite( Pin13LED, LOW) ;
delay( 10) ;
RS485Serial.write ( 54) ;
digitalWrite( Pin13LED, LOW) ;
delay( 10) ;
RS485Serial.write ( 55) ;
digitalWrite( Pin13LED, LOW) ;
delay( 10) ;
RS485Serial.write ( 56) ;
digitalWrite( Pin13LED, LOW) ;
delay( 10) ;
RS485Serial.write ( 57) ;
digitalWrite( Pin13LED, LOW) ;
delay( 10) ;
digitalWrite( SSerialTxControl, RS485Receive) ;
}
}
if ( RS485Serial.available ( ) )
{
digitalWrite( Pin13LED, HIGH) ;
byteReceived = RS485Serial.read ( ) ;
Serial.write ( byteReceived) ;
delay( 10) ;
digitalWrite( Pin13LED, LOW) ;
}
}
slave:
Codice sorgente - presumibilmente C++
#include <SoftwareSerial.h>
#include <WString.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX 10 //Serial Receive pin
#define SSerialTX 11 //Serial Transmit pin
#define SSerialTxControl 3 //RS485 Direction control
#define RS485Transmit HIGH
#define RS485Receive LOW
#define Pin13LED 13
SoftwareSerial RS485Serial( SSerialRX, SSerialTX) ; // RX, TX
int byteReceived;
int byteSend;
int * data;
int counter = 0 ;
void setup( )
{
Serial.begin ( 9600) ;
Serial.println ( "SerialRemote" ) ;
pinMode( Pin13LED, OUTPUT) ;
pinMode( SSerialTxControl, OUTPUT) ;
digitalWrite( SSerialTxControl, RS485Receive) ;
RS485Serial.begin ( 127000) ;
}
void loop( )
{
if ( RS485Serial.available ( ) )
{
while ( RS485Serial.available ( ) > 0)
{
byteSend = RS485Serial.read ( ) ;
data[ counter] + = byteSend;
digitalWrite( Pin13LED, HIGH) ;
delay( 10) ;
digitalWrite( Pin13LED, LOW) ;
counter++ ;
}
digitalWrite( SSerialTxControl, RS485Transmit) ;
if ( data[ 0] == 48)
{
RS485Serial.write ( 48) ;
delay( 10) ;
}
digitalWrite( SSerialTxControl, RS485Receive) ;
}
}
non riesco a capire come mai sulla seriale del master appare continuamente la lettera p quando dovrebbe comparire un 1 quando io scrivo 1 sulla seriale del master :S.
Roby94 (Member )
Guru
Messaggi: 1170
Iscritto: 28/12/2009
Come sono collegate le due schede? Lo standard RS485 non puō essere gestito direttamente da Arduino.
alex1995 (Normal User)
Expert
Messaggi: 294
Iscritto: 27/01/2011
avevo sbagliato a collegare l' rs485 nell arduino uno, l' ho messo su 3.3v poi l' ho spostato sul 5 e ha funzionato. che vuol dire che lo standard rs485 non puō essere gestito da arduino?
questo č il sorgente che ora funziona.
Master:
Codice sorgente - presumibilmente C++
#include <SoftwareSerial.h>
#define SSerialRX 10 //Serial Receive pin
#define SSerialTX 11 //Serial Transmit pin
#define SSerialTxControl 3 //RS485 Direction control
#define RS485Transmit HIGH
#define RS485Receive LOW
SoftwareSerial RS485Serial( SSerialRX, SSerialTX) ; // RX, TX
char charbuff;
char message;
String buffer;
void setup( )
{
pinMode( 13, OUTPUT) ;
pinMode( SSerialTxControl, OUTPUT) ;
digitalWrite( SSerialTxControl, RS485Transmit) ; // trasmetti
Serial.begin ( 9600) ;
RS485Serial.begin ( 127000) ;
}
void loop( )
{
if ( Serial.available ( ) )
{
charbuff = ( char ) Serial.read ( ) ;
buffer = String( charbuff) ;
if ( buffer == "A" )
{
digitalWrite( SSerialTxControl, RS485Transmit) ; // Enable RS485 Transmit
digitalWrite( 13, HIGH) ;
RS485Serial.print ( "A" ) ; // Send charbuff to Remote Arduino
digitalWrite( SSerialTxControl, RS485Receive) ; // Disable RS485 Transmit
digitalWrite( 13, LOW) ;
delay( 10) ;
buffer = "" ;
}
}
if ( RS485Serial.available ( ) )
{
message = RS485Serial.read ( ) ;
Serial.print ( message) ;
}
}
Slave:
Codice sorgente - presumibilmente C++
#include <SoftwareSerial.h>
#define SRS485SerialRX 10 //RS485Serial Receive pin
#define SRS485SerialTX 11 //RS485Serial Transmit pin
#define SRS485SerialTxControl 3 //RS485 Direction control
#define RS485Transmit HIGH
#define RS485Receive LOW
SoftwareSerial RS485Serial( SRS485SerialRX, SRS485SerialTX) ; // RX, TX
char charbuff;
String buffer;
void setup( )
{
pinMode( 13, OUTPUT) ;
pinMode( SRS485SerialTxControl, OUTPUT) ;
digitalWrite( SRS485SerialTxControl, RS485Receive) ; // trasmetti
RS485Serial.begin ( 9600) ;
RS485Serial.begin ( 127000) ;
}
void loop( )
{
if ( RS485Serial.available ( ) )
{
charbuff = ( char ) RS485Serial.read ( ) ;
if ( charbuff ! = ( char ) - 1)
{
buffer + = String( charbuff) ;
}
if ( buffer == "A" )
{
delay( 10) ;
digitalWrite( SRS485SerialTxControl, RS485Transmit) ; // Enable RS485 Transmit
digitalWrite( 13, HIGH) ;
RS485Serial.print ( "B" ) ; // Send charbuff to Remote Arduino
digitalWrite( SRS485SerialTxControl, RS485Receive) ; // Disable RS485 Transmit
digitalWrite( 13, LOW) ;
buffer = "" ;
}
}
}
Ultima modifica effettuata da alex1995 il 24/12/2015 alle 13:50
Roby94 (Member )
Guru
Messaggi: 1170
Iscritto: 28/12/2009
Arduino lavora con segnali digitali, 1 e 0 sopra i 5.5V danneggi la porta, segnale differenziale deve coprire una gamma di valori piu ampia, proprio perché deve resistere ai disturbi che su livello differenziale si annullano, se puoi generare solo 5V e 0V non puoi generare e ricevere un vero segnale differenziale, tanto č vero che la RS232 viene solitamente gestita mediante MAX232 con gli AVR.
alex1995 (Normal User)
Expert
Messaggi: 294
Iscritto: 27/01/2011
ok grazie
alex1995 (Normal User)
Expert
Messaggi: 294
Iscritto: 27/01/2011
io non lo uso perche devo metterlo in un ambiente con disturbi ma per la distanza elevata che riesce a raggiungere, devo arrivare sopra i 100 mt.
ora ho modificato il sorgente cosė e va pių veloce il comando con la risposta solo che non riesco a capire perche se io do il comando all arduino nano (slave a) 3-4 volte di seguito lui risponde velocemente se invece do il comando allo slave a e poi al b velocemente il b non risponde se invece io aspetto circa 1 secondo tra comando all a e poi al b il b risponde, eppure io guardo i led della direzione del segnale e va immediatamente a low quindi il b dovrebbe essere in grado di ricevere e trasmettere immediatamente :S.
questo č il sorgente master:
Codice sorgente - presumibilmente C++
#include <SoftwareSerial.h>
#define SRS485SerialRX 10 //RS485Serial Receive pin
#define SRS485SerialTX 11 //RS485Serial Transmit pin
#define SRS485SerialTxControl 13 //RS485 Direction control
#define RS485Transmit HIGH
#define RS485Receive LOW
SoftwareSerial RS485Serial( SRS485SerialRX, SRS485SerialTX) ; // RX, TX
char charbuff;
String message;
String buffer;
void setup( )
{
pinMode( 13, OUTPUT) ;
pinMode( SRS485SerialTxControl, OUTPUT) ;
digitalWrite( SRS485SerialTxControl, RS485Receive) ; // trasmetti
Serial.begin ( 9600) ;
RS485Serial.begin ( 4600) ;
}
void loop( )
{
begin:
if ( digitalRead( SRS485SerialTxControl) ! = LOW)
{
digitalWrite( SRS485SerialTxControl, RS485Receive) ;
RS485Serial.flush ( ) ;
Serial.flush ( ) ;
}
if ( RS485Serial.available ( ) )
{
while ( RS485Serial.available ( ) )
{
while ( String( charbuff) ! = String( ( char ) - 1) )
{
charbuff = ( char ) RS485Serial.read ( ) ;
if ( String( charbuff) ! = String( ( char ) - 1) )
{
Serial.print ( charbuff) ;
}
if ( String( charbuff) == String( "\n " ) )
{
Serial.print ( charbuff) ;
RS485Serial.flush ( ) ;
Serial.flush ( ) ;
break ;
}
}
}
}
if ( Serial.available ( ) )
{
charbuff = ( char ) Serial.read ( ) ;
buffer = String( charbuff) ;
if ( buffer == "A" )
{
digitalWrite( SRS485SerialTxControl, RS485Transmit) ; // Enable RS485 Transmit
RS485Serial.print ( "A10" ) ; // Send charbuff to Remote Arduino
RS485Serial.flush ( ) ;
digitalWrite( SRS485SerialTxControl, RS485Receive) ; // Disable RS485 Transmit
buffer = "" ;
goto begin;
}
if ( buffer == "B" )
{
digitalWrite( SRS485SerialTxControl, RS485Transmit) ; // Enable RS485 Transmit
RS485Serial.print ( "B10" ) ; // Send charbuff to Remote Arduino
RS485Serial.flush ( ) ;
digitalWrite( SRS485SerialTxControl, RS485Receive) ; // Disable RS485 Transmit
buffer = "" ;
goto begin;
}
}
}
slave a:
Codice sorgente - presumibilmente C++
#include <SoftwareSerial.h>
#define SRS485SerialRX 4 //RS485Serial Receive pin
#define SRS485SerialTX 3 //RS485Serial Transmit pin
#define SRS485SerialTxControl 13 //RS485 Direction control
#define RS485Transmit HIGH
#define RS485Receive LOW
SoftwareSerial RS485Serial( SRS485SerialRX, SRS485SerialTX) ;
char byteBuffer;
String commandBuffer;
void setup( )
{
pinMode( 13, OUTPUT) ;
Serial.begin ( 9600) ;
RS485Serial.begin ( 4600) ;
digitalWrite( SRS485SerialTxControl, RS485Receive) ;
}
void loop( )
{
if ( digitalRead( SRS485SerialTxControl) ! = LOW)
{
digitalWrite( SRS485SerialTxControl, RS485Receive) ;
}
if ( RS485Serial.available ( ) )
{
if ( digitalRead( SRS485SerialTxControl) ! = LOW)
{
digitalWrite( SRS485SerialTxControl, RS485Receive) ;
}
while ( RS485Serial.available ( ) )
{
if ( digitalRead( SRS485SerialTxControl) ! = LOW)
{
digitalWrite( SRS485SerialTxControl, RS485Receive) ;
}
byteBuffer = ( char ) RS485Serial.read ( ) ;
if ( String( byteBuffer) ! = String( ( char ) - 1) )
{
commandBuffer + = String( byteBuffer) ;
}
else
{
break ;
}
if ( commandBuffer.length ( ) == 3)
{
if ( String( commandBuffer) == String( "A10" ) )
{
delay( 10) ;
Serial.println ( "mando" ) ;
digitalWrite( SRS485SerialTxControl, RS485Transmit) ;
RS485Serial.print ( "X12345678901234567890123456789012345678901234567890123456789012345678901234567890\n " ) ;
RS485Serial.flush ( ) ;
digitalWrite( SRS485SerialTxControl, RS485Receive) ;
commandBuffer = "" ;
break ;
}
}
if ( commandBuffer.length ( ) > 3)
{
RS485Serial.flush ( ) ;
if ( digitalRead( SRS485SerialTxControl) ! = LOW)
{
digitalWrite( SRS485SerialTxControl, RS485Receive) ;
}
commandBuffer = "" ;
break ;
}
}
}
}
slave b:
Codice sorgente - presumibilmente C++
#include <SoftwareSerial.h>
#define SRS485SerialRX 4 //RS485Serial Receive pin
#define SRS485SerialTX 3 //RS485Serial Transmit pin
#define SRS485SerialTxControl 13 //RS485 Direction control
#define RS485Transmit HIGH
#define RS485Receive LOW
SoftwareSerial RS485Serial( SRS485SerialRX, SRS485SerialTX) ;
char byteBuffer;
String commandBuffer;
void setup( )
{
pinMode( 13, OUTPUT) ;
Serial.begin ( 9600) ;
RS485Serial.begin ( 4600) ;
digitalWrite( SRS485SerialTxControl, RS485Receive) ;
}
void loop( )
{
if ( digitalRead( SRS485SerialTxControl) ! = LOW)
{
digitalWrite( SRS485SerialTxControl, RS485Receive) ;
}
if ( RS485Serial.available ( ) )
{
if ( digitalRead( SRS485SerialTxControl) ! = LOW)
{
digitalWrite( SRS485SerialTxControl, RS485Receive) ;
}
while ( RS485Serial.available ( ) )
{
if ( digitalRead( SRS485SerialTxControl) ! = LOW)
{
digitalWrite( SRS485SerialTxControl, RS485Receive) ;
}
byteBuffer = ( char ) RS485Serial.read ( ) ;
if ( String( byteBuffer) ! = String( ( char ) - 1) )
{
commandBuffer + = String( byteBuffer) ;
}
else
{
break ;
}
if ( commandBuffer.length ( ) == 3)
{
if ( String( commandBuffer) == String( "A10" ) )
{
delay( 10) ;
Serial.println ( "mando" ) ;
digitalWrite( SRS485SerialTxControl, RS485Transmit) ;
RS485Serial.print ( "Z12345678901234567890123456789012345678901234567890123456789012345678901234567890\n " ) ;
RS485Serial.flush ( ) ;
digitalWrite( SRS485SerialTxControl, RS485Receive) ;
commandBuffer = "" ;
break ;
}
}
if ( commandBuffer.length ( ) > 3)
{
RS485Serial.flush ( ) ;
if ( digitalRead( SRS485SerialTxControl) ! = LOW)
{
digitalWrite( SRS485SerialTxControl, RS485Receive) ;
}
commandBuffer = "" ;
break ;
}
}
}
}