Forum: Mikrocontroller und Digitale Elektronik TX und RX Probleme


von Addi S. (staasi)


Lesenswert?

Moin,

bin noch nicht so lange dabei und stehe auf dem Schlauch.
Ich bin dabei zwei Arduinos zu verbinden:

Nano Sender
Uno Empfänger

Ich möchte einen string mit Serial.write senden (Nano) und die Ausgänge 
des UNO schalten.

Im Code habe ich zwei Situationen, eine Funktioniert, eine nicht.

Zwei Taster, jeder schaltet jeweils einen Ausgang Ein/Aus.

Taster 1: Funktioniert nicht
Einschalten: string
Ausschalten: string

Taster 2: Funktioniert
Einschalten: string
Ausschalten: absolut zahl


Das Ganze soll später auf 8 Taster/Ausgänge erweitert werden.
Später soll der Sender auch Analogsignale senden.

Sender:

// Sender Prezelboard
byte Taster1 = 10; // Input
byte Taster2 = 12; // Input
//int an1 = 2; // nicht genutzt
//int aus1 = 4; // nicht genutzt
//char an2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 's'}; // nicht genutzt
//char aus2[8] = {'a', 'r', 'd', 'u', 'i', 'n', '2'}; // nicht genutzt
char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'b'};
char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};
char Str1[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'a'};
/////////////////////////////////////////////////////////////
byte zahl = 0;
boolean flanke = 0;
boolean last_state;
/////////////////////////////////////////////////////////////
byte zahl1 = 0;
boolean flanke1 = 0;
boolean last_state1;
/////////////////////////////////////////////////////////////
void setup()
{
 Serial.begin(9600);
 pinMode(Taster1, INPUT);
 pinMode(Taster2, INPUT);
}

void loop()
{
/////////////////////////////////////////////////////////////
int state = digitalRead(Taster1); // Taster 1

  if (state != last_state)
    {
    delay(10);
    last_state = state;
      if(state == LOW)
      {
      flanke=flanke +1 ;
      zahl=zahl + 15;
      }
    }
  if (zahl == 15)
    {
    Serial.write(Str2);
    zahl = 30;
    }
  if (zahl == 45)
    {
    Serial.write(Str3);
    zahl = 0;
    }
/////////////////////////////////////////////////////////////
int state1 = digitalRead(Taster2); // Taster 2

  if (state1 != last_state1)
    {
    delay(10);
    last_state1 = state1;
      if(state1 == LOW)
      {
      flanke1=flanke1 +1 ;
      zahl1=zahl1 + 15;
      }
    }
  if (zahl1 == 15)
    {
    Serial.write(Str1);
    zahl1 = 30;
    }
  if (zahl1 == 45)
    {
    Serial.write(8);
    zahl1 = 0;
    }
/////////////////////////////////////////////////////////////
//int analog = analogRead(0) + 1000;
// Serial.write(analog);
/////////////////////////////////////////////////////////////
}


######################################################################## 
###


Empfänger:

// ArduinUno Empfänger

int val;
int setze;

void setup()
{
 Serial.begin(9600);
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
}

void loop()
{
if (Serial.available())
{
  val = Serial.read();
  Serial.println(val);
}

if (val == 'a', 'r', 'd', 'u', 'i', 'n', 'o')
{
  digitalWrite(8, 1);
  }
if (val == 'a', 'r', 'd', 'u', 'i', 'n', 'b')
{
  digitalWrite(8, 0);
  }

  if (val == 'a', 'r', 'd', 'u', 'i', 'n', 'a')
{
  digitalWrite(9, 1);
  }
if (val == 8)
{
  digitalWrite(9, 0);
  }
}

Danke für eure Hilfe

von Joachim B. (jar)


Lesenswert?

Addi S. schrieb:
> bin noch nicht so lange dabei und stehe auf dem Schlauch.
> Ich bin dabei zwei Arduinos zu verbinden:
>
> Nano Sender
> Uno Empfänger

wie soll das gwehen?

beide haben USB bridges on Board und sind Slaves!
keiner kann USB Master spielen, eine direkte Verbindung ist mir mit Rx 
und Tx passend verbunden nie gelungen weil der USB Chip die Leitung 
festhält.

mit mini PRO 328 ohne FTDI kann das klappen

von Addi S. (staasi)


Lesenswert?

Danke für die Antwort.

Es funktioniert. Wenn ich das geänderte Programm hochladen möchte muss 
ich die Tx/Rx Verbindung auftrennen, nervig aber geht.
Habe anfangs nur mit absoluten Zahlen gearbeitet, finde die Aufteilung 
in string für Einzelbereiche deutlich besser.

von Manfred (Gast)


Lesenswert?

Joachim B. schrieb:
> eine direkte Verbindung ist mir mit Rx
> und Tx passend verbunden nie gelungen weil der USB Chip die Leitung
> festhält.

Die Leitungen zwischen dem AT328 und der USB-Bridge sollten mit 
Widerständen entkoppelt sein. Ob das jeder Chinese korrekt umsetzt, 
steht auf einem anderen Blatt - vom originalen Schaltungsdesign her ist 
das möglich.

Hätte ich das in einer realen Anwendung vor, würde ich den ProMini 
bevorzugen, der hat keinen USB-Baustein.

von DAVID B. (bastler-david)


Lesenswert?

kann zum Thema nicht viel beitragen für den sender gehts aber einfacher 
mit :
https://www.arduino.cc/en/Reference/SoftwareSerial
wenn man noch einen pin frei hat.

Und digitalWrite(9, 0); habe ich noch nie gesehen.
kenne nur digitalWrite(9, HIGH); oder digitalWrite(9, LOW);

: Bearbeitet durch User
von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Addi S. schrieb:
> if (val == 'a', 'r', 'd', 'u', 'i', 'n', 'o')

was soll das werden? val ist ein int value!
und eine zeichenkette kann man wohl kaum so vergleichen.
ich sag nichts weiter dazu, das web ist voll von beispielen hierzu.

die initialisierung ist auch "behindert" ...
char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'b'};


mt

von PittyJ (Gast)


Lesenswert?

Apollo M. schrieb:
> Addi S. schrieb:
>> if (val == 'a', 'r', 'd', 'u', 'i', 'n', 'o')
>
> was soll das werden? val ist ein int value!
> und eine zeichenkette kann man wohl kaum so vergleichen.
> ich sag nichts weiter dazu, das web ist voll von beispielen hierzu.
>

Ist das nicht der Komma-Operator in dem if?
Das sind 7 Ausdrücke
val =='a'
..
'o'

und der letzte wird für das if herangezogen.
Man könnte auch schreiben
if('o')
Was immer true ist. Also wird das in den geschweiften Klammern immer 
ausgeführt.

Oder sehe ich das falsch?

von Stefan F. (Gast)


Lesenswert?

Manfred schrieb:
> Die Leitungen zwischen dem AT328 und der USB-Bridge sollten mit
> Widerständen entkoppelt sein. Ob das jeder Chinese korrekt umsetzt,
> steht auf einem anderen Blatt - vom originalen Schaltungsdesign her ist
> das möglich.

Ich musste auf meinen Arduino Nano Clones (die mit CH341 Chip) die Rx 
LED entfernen, damit dieser Anschluss extern belegt werden konnte. Bei 
einem funktionierte nicht einmal der USB Anschluss, solange die LED 
drauf war. Ist ein bekannter Designfehler, den man anhand des 
Schaltplanes und der elektrischen Daten der beiden Chips nachvollziehen 
kann.

von Addi (Gast)


Lesenswert?

Danke für die vielen Antworten.

/////////////////////////////////////////////////////////////////////

Autor: Manfred (Gast)

Datum: 26.11.2018 23:20

Joachim B. schrieb:
> eine direkte Verbindung ist mir mit Rx
> und Tx passend verbunden nie gelungen weil der USB Chip die Leitung
> festhält.

Die Leitungen zwischen dem AT328 und der USB-Bridge sollten mit
Widerständen entkoppelt sein. Ob das jeder Chinese korrekt umsetzt,
steht auf einem anderen Blatt - vom originalen Schaltungsdesign her ist
das möglich.


Ich habe keinen Widerstand in der Leitung, einige meinen Ja, einige 
Nein.
Ist ein versuch wert!

/////////////////////////////////////////////////////////////////////

Autor: Apollo M.(Firma: @home)(majortom)

Datum: 27.11.2018 02:43

Addi S. schrieb:
> if (val == 'a', 'r', 'd', 'u', 'i', 'n', 'o')

was soll das werden? val ist ein int value!
und eine zeichenkette kann man wohl kaum so vergleichen.
ich sag nichts weiter dazu, das web ist voll von beispielen hierzu.

die initialisierung ist auch "behindert" ...
char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'b'};

mt


Ich sehe im SerialMonitor das es richtig Übermittelt wird. Und es 
funktioniert auch! Das dort "Arduino" steht ist nur zweitrangig.
Es geht um die Funktion. Es könnte dort auch "L1an" = Leuchte 1 an 
eingetragen werden..

Zu dem behindert sage ich mal nichts, bin kein Profi.

/////////////////////////////////////////////////////////////////////

Autor: Stefanus F.(stefanus)

Datum: 27.11.2018 07:59

Manfred schrieb:
> Die Leitungen zwischen dem AT328 und der USB-Bridge sollten mit
> Widerständen entkoppelt sein. Ob das jeder Chinese korrekt umsetzt,
> steht auf einem anderen Blatt - vom originalen Schaltungsdesign her ist
> das möglich.

Ich musste auf meinen Arduino Nano Clones (die mit CH341 Chip) die Rx
LED entfernen, damit dieser Anschluss extern belegt werden konnte. Bei
einem funktionierte nicht einmal der USB Anschluss, solange die LED
drauf war. Ist ein bekannter Designfehler, den man anhand des
Schaltplanes und der elektrischen Daten der beiden Chips nachvollziehen
kann.

Löten wollte ich nicht, danke für den Hinweis.

von Teo D. (teoderix)


Lesenswert?

DAVID -. schrieb:
> Und digitalWrite(9, 0); habe ich noch nie gesehen.
> kenne nur digitalWrite(9, HIGH); oder digitalWrite(9, LOW);

Ach david... Daß das großgeschrieben ist, sollte dir den Hinweis geben, 
das es sich da um ein Makro handelt (#define). Deine IDE sollte das auch 
entsprechen highlighten.
Wird also vom PreCompiler entsprechend ersetzt.

von Stefan F. (Gast)


Lesenswert?

Addi schrieb:
>> Ich musste auf meinen Arduino Nano Clones (die mit CH341 Chip) die Rx
>> LED entfernen

> Löten wollte ich nicht, danke für den Hinweis.

Die kannst du einfach mit einer Zange abreißen. Ich habe nochmal in den 
Schaltplan geschaut -> Vermutlich ist das in deinem Fall nicht die 
Problemursache. Die Rx LED stört die Funktion des USB-UART. 
Direktverbindungen zwischen AVR+AVR sind nicht betroffen.

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Apollo M. schrieb:
> Addi S. schrieb:
>> if (val == 'a', 'r', 'd', 'u', 'i', 'n', 'o')
>
> was soll das werden? val ist ein int value!
> und eine zeichenkette kann man wohl kaum so vergleichen.
> ich sag nichts weiter dazu, das web ist voll von beispielen hierzu.


if (val == 'a', 'r', 'd', 'u', 'i', 'n', 'o') entspricht
if ('o') und ist immer wahr - wolltest du das? sicher nicht!


> die initialisierung ist auch "behindert" ...
> char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'b'};

warum nicht gleich als string?
char Str3[] = {"ardunio"};

zum gültigen string vergleich muss man per hand schon mehr machen als 
hier gezeigt oder mal die lib's studieren ob so etwas nicht schon 
mitgeliefert wird, ... auch selber nachdenken und weniger fragen hilft 
oft.



mt

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.