Also, ich habe das ganze noch einmal umgebaut.
Hardware technisch hat sich nichts verändert außer das ich den Eingang RE dauerhaft auf GND ziehe. Ich habe an mehreren Stellen gelesen das könne man so machen und dann nur DE HIGH und LOW schalten.
Ich hatte die MAX 485 abmontiert und bei meinen Arduinos die TX und RX der SoftwareSerial (10 und 11) miteinander verbunden
11->10
10->11
Ich möchte von einem Arduino A aus zwei Byte an Arduino B senden . Byte 1 ist eine ID byte 2 beschreibt die Zustände an 8 Digitaloutputs.
Danach soll B diese Digitaloutputs setzen und den bekommenen Wert+ ID zurück an A senden, damit A weis das alles richtig empfangen wurde.
Das sieht für arudino A So aus:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);
// RX on digital pin 10
// TX on digital pin 11
byte blockstate=0b00000000;
byte data [2];
uint8_t value =0;
int returnID=-1;
int returnvalue=-1;
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("Arduino2 Start RS485 RT Test");
digitalWrite(2,HIGH);
}
void loop() {
for (uint8_t IDB=0;IDB<=7;IDB++){ //for each valveblock
value=0b00000000; //reset valvestates
//Set Valvechannelstates//
for(uint8_t IDC=0; IDC<=7;IDC++){ //for each channel of one valveblock
value=(value<<1); //shift value left
//read Channelstate//
value=(value|=(1<<0)); //add new valvechannelstate(static for now)
value=0b10010110;
}//FOR IDC
//Send State to block
digitalWrite(2,HIGH);
while(!digitalRead(2)){};
mySerial.write('/'); //send initial char
mySerial.write(IDB); //send ID of vlaveblock
mySerial.write(value); //send valvechannelstates
Serial.print("I Send ");Serial.print(value,BIN); //debugprinting
Serial.print(" To ID ");Serial.println(IDB); //debugprinting
digitalWrite(2,LOW);
while(digitalRead(2)){}
//Serial.print(digitalRead(2));
mySerial.readBytesUntil('|',data,2); //read return
bool validreturn=false; //declare Bool for Valid Return
validreturn=((mySerial.readBytesUntil('|',data,2))==2); //Set Bool for Valid Return
if(validreturn){ //If Bool is true
returnID=data[0]; // Set return ID
returnvalue=data[1]; // Set Value
}
else{ //If Bool is false
returnID=-1; //set Return ID to default
returnvalue=-1; //set Return value to default
}
if((IDB==returnID)&&(value==returnvalue)) //if compare Send and Return is true
{
digitalWrite(7,HIGH); //green LED On
digitalWrite(6,LOW); //yellow LED OFF
digitalWrite(5,LOW); //red LED OFF
Serial.println("Correct Return Value"); //debugprinting
}//ifEqual
if((returnID==-1)||(returnvalue==-1)){ // if return ID and Value =-1
digitalWrite(5,LOW); //green LED OFF
digitalWrite(6,LOW); //yellow LED On
digitalWrite(7,HIGH); //red LED OFF
Serial.println("No Device"); //debugprinting
}//if-1
if((!((returnID==-1)||(returnvalue==-1)))&&(!((IDB==returnID)&&(value==returnvalue))))//if compare Send or Return is false but not -1
{
digitalWrite(5,LOW); //green LED OFF
digitalWrite(6,HIGH); //yellow LED On
digitalWrite(7,LOW); //red LED OFF
Serial.println("BAD Return VALUE"); //debugprinting
}//if bad value not -1
}//For IDB
}//LOOP
und für Arduino B so:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);
// RX on digital pin 10
// TX on digital pin 11
String sendMessage;
String receivedMessage;
uint8_t ID =0;
int readID=0;
int value =0;
byte data [2];
void setup() {
pinMode(7,INPUT);
pinMode(6,INPUT);
pinMode(5,INPUT);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("Arduino1 Start RS485 RT Test");
digitalWrite(2,LOW);
}
void loop() {
ID =(digitalRead(5)<<2);
ID +=(digitalRead(6)<<1);
ID +=(digitalRead(7));
digitalWrite(2,LOW);
while(digitalRead(2)){}
mySerial.readBytesUntil('/',data,2);
if(readID!=data[0]){
Serial.print("My ID is: ");Serial.print(ID);
readID=data[0];
value=data[1];
Serial.print(" readID= ");Serial.print (readID);
Serial.print(" Value= ");Serial.println(value,BIN);
if(readID==ID){
digitalWrite(2,HIGH);
while(!digitalRead(2)){
Serial.println(digitalRead(2));
};
Serial.println(digitalRead(2));
Serial.print("SET VALVES to ");Serial.println(value,BIN);
mySerial.write('|');
mySerial.write(readID);
mySerial.write(value);
Serial.print("I return ID: ");Serial.print(readID);Serial.print(" and value: ");Serial.println(value,BIN);
}
}
}
Das Ergebnis sieht so aus:
Arduino A:
I Send 10010110 To ID 0
No Device
I Send 10010110 To ID 1
No Device
I Send 10010110 To ID 2
No Device
I Send 10010110 To ID 3
No Device
I Send 10010110 To ID 4
Correct Return Value
I Send 10010110 To ID 5
No Device
I Send 10010110 To ID 6
No Device
I Send 10010110 To ID 7
No Device
und bei Arduino B sieht es so aus:
My ID is: 4 readID= 0 Value= 10010110
My ID is: 4 readID= 1 Value= 10010110
My ID is: 4 readID= 2 Value= 10010110
My ID is: 4 readID= 3 Value= 10010110
My ID is: 4 readID= 4 Value= 10010110
1
SET VALVES to 10010110
I return ID: 4 and value: 10010110
My ID is: 4 readID= 5 Value= 10010110
My ID is: 4 readID= 6 Value= 10010110
So gesehen gehe ich mal davon as das mein Code richtig ist.
aber wenn ich die MAX485 Basteine verwende bekomm ich kein Return vom Arduino B