Browse Source

Erste Verison mit Kollisions-Vermeidung.

Kollisions-Erkennung sollte auch funktionierten, aber das ist nicht ganz klar.

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
nano-revision-1.0
Stephan Richter 1 year ago
parent
commit
c836478d25
  1. 64
      Receiver/Receiver.ino
  2. 80
      Sender/Sender.ino

64
Receiver/Receiver.ino

@ -1,19 +1,59 @@
#include <SoftwareSerial.h> int sTx = 2;
int sRx = 3;
int baud = 19200;
int sTx = 4;
int sRx = 5;
SoftwareSerial mySerial(sRx,sTx);
long base = 800;
long rst = base*10; // reset
boolean bt = false;
long dif = 0;
long lt = 0;
long now = 0;
char rcv = 0;
int idx = 0;
String message;
void setup(){ void setup(){
pinMode(sRx,INPUT);
pinMode(sTx,OUTPUT);
attachInterrupt(digitalPinToInterrupt(sRx),change,CHANGE);
Serial.begin(115200); Serial.begin(115200);
mySerial.begin(baud);
Serial.println("Receiver ready"); Serial.println("Receiver ready");
} }
void loop(){ void reset(long dif){
if (mySerial.available() > 0){ rcv = 0;
char c = mySerial.read(); idx = -1;
Serial.print(c); message.reserve(32);
} }
void change(){
bool bt = digitalRead(sRx);
now = micros();
dif = now - lt;
lt = now;
if (dif > rst){
reset(dif);
} else {
handle(!bt,dif);
}
}
void handle(boolean bt, long dif){
long count = dif/base;
for (int i=0; i<count; i++) push(bt);
} }
void push(boolean bt){
if (idx>=0) rcv |= bt<<idx;
idx++;
if (idx == 8){
if (rcv == 13) {
Serial.println(message);
message = "";
} else {
message+=rcv;
}
idx =0;
rcv =0;
}
}
void loop(){}

80
Sender/Sender.ino

@ -1,19 +1,25 @@
#include <SoftwareSerial.h>
int sTx = 4; int sTx = 4;
int sRx = 5; int sRx = 5;
SoftwareSerial mySerial(sRx,sTx);
long base = 800;
int id = 0; int id = 0;
int baud = 19200; int baud = 19200;
int enable = 2; int enable = 2;
char c; char c;
int counter = 0; int counter = 0;
void setup(){ void setup(){
pinMode(A0,INPUT); pinMode(A0,INPUT);
id = analogRead(A0)*10; id = analogRead(A0)*10;
pinMode(enable,OUTPUT); pinMode(enable,OUTPUT);
mySerial.begin(baud); digitalWrite(enable,LOW);
pinMode(sTx,OUTPUT);
digitalWrite(sTx,LOW);
pinMode(sRx,INPUT);
Serial.begin(115200); Serial.begin(115200);
Serial.print("Baud rate set to "); Serial.print("Baud rate set to ");
Serial.println(baud); Serial.println(baud);
@ -21,23 +27,61 @@ void setup(){
Serial.println(id); Serial.println(id);
} }
void printSerial(){ bool sendBit(bool bt){
while (mySerial.available()){ digitalWrite(sTx,bt);
c = mySerial.read(); delayMicroseconds(80);
Serial.print(c); if (digitalRead(sTx) != bt) return false;
} delayMicroseconds(base-80);
return true;
} }
void loop(){ bool sendChar(char c){
printSerial(); return sendBit(c & 0x01)
delay(id); && sendBit(c & 0x02)
&& sendBit(c & 0x04)
&& sendBit(c & 0x08)
&& sendBit(c & 0x10)
&& sendBit(c & 0x20)
&& sendBit(c & 0x40)
&& sendBit(c & 0x80);
}
bool sendString(String s){
Serial.print("Sending '"+s+"'…");
boolean busy = false;
for (int i = 0; i<11; i++){
if (!digitalRead(sRx)) {
if (!busy){
Serial.print("busy…");
busy = true;
}
i = 0; // wait for free line
}
delayMicroseconds(base);
}
digitalWrite(enable,HIGH); digitalWrite(enable,HIGH);
mySerial.print("Arduino #"); bool success = sendBit(0); // erste Flanke erzeugen
mySerial.print(id); if (success) {
mySerial.print(": Counter = "); for (char c : s){
mySerial.println(counter); if (!sendChar(c)){
mySerial.flush(); success = false;
break;
}
}
}
success = success && sendChar(13);
success = success && sendBit(1); // letzte Flanke erzeugen
digitalWrite(enable,LOW); digitalWrite(enable,LOW);
printSerial(); Serial.println(success ? "success" : "failed");
return success;
}
void loop(){
counter++; counter++;
String s = "Hier ist ";
s.concat(id);
s+=": counter = ";
s.concat(counter);
while (!sendString(s)) delay(10*base);
delay(id);
} }

Loading…
Cancel
Save