Kommunikation Serial Monitor (über RS485 Shield V2) mit Hterm

hi,

Du arbeitest mit 9600 baud. also 1 bit in 104,17 µS.

pro byte werden 10 bit gesendet (mit start- und stopbit), also ein byte in etwa 1 mS.

ich würde etwa delay(20) versuchen.

oder Du versuchst es statt dessen nochmal mit flush().

gruß stefan

EDIT: alternative: nimm mal 50mS und schau, ob RX aufblinkt. dann geh runter bis RX nicht mehr blinkt. an diesem punkt ist das delay zu kurz und TX ist disabled, obwohl noch nicht alles draußen ist. deshalb antwortet der sender nicht (keine gültige anforderung) und sendet keinen wert zurück >> kein blinken an RX.

Hi Marcel

Schön, dass der erste Teil schon mal funktioniert.

Versuch doch mal folgendes:

#include <SoftwareSerial.h>

const byte ENABLE_PIN = 9;

SoftwareSerial RS485Serial(2, 3);

void setup() {
  Serial.begin(9600);
  RS485Serial.begin(9600);

  digitalWrite (ENABLE_PIN, HIGH);
  RS485Serial.println("gettemperature!15");
  delay(20);  
  digitalWrite (ENABLE_PIN, LOW);
}

void loop() {
  if (RS485Serial.available()) {
    byte inByte = RS485Serial.read();
    Serial.write(inByte);
  }  
}

Noch folgende Anmerkungen dazu:
Das Senden auf RS485 habe ich mal in Setup genommen, damit der Befehl nur einmal gesendet wird. Andernfalls sendest du alle 2 Sekunden an den Tempsensor, was für Testzwecke imho etwas viel ist. Lieber einmal und dann auf die Antwort warten...

Dann habe ich \r\n aus dem RS485Serial.println entfernt, da .println diese automatisch mitschickt. Siehe dazu auch die Refernz zu diesem Befehl. Doppelt braucht's wohl nicht.

In der Loop wartet das Programm jetzt nur noch darauf, dass etwas über den Bus zurück kommt und gibt dies dann auf Serial aus.

Bei deiner Variante wurde nur ein Byte nach dem Senden gelesen. Ich denke nicht, dass du das vor hattest :wink:

Sollte so immer noch nichts ankommen, dann spiele ein wenig mit der Delay-Zeit. Oder du kannst auch mal probieren vom PC aus den Abfragebefehl zu senden. Eigentlich müsstest du dann im Serial Monitor zuerst die Anfrage vom PC und anschliessen die Antwort vom Temperatursensor sehen.

Das wäre sowieso mal interessant zu sehen. Poste doch mal, was du im Serial Monitor der Arduino IDE siehst, wenn du das obige Programm am laufen hast und dann mit dem PC eine Anfrage an den Tempsensor schickst.

Grüsse
Peter

Hi - habe jetzt mit delay(20) getestet und dem Sketch mit dem Tx Teil im setup. Habe das delay erhöht jedoch nie ein Response bekommen. Habt ihr sonst noch eine Idee?

Das mit der printfunktion ist gut zu wissen ich brauchen nämlich ein cr oder nl dass der sensor antwortet.

haha nein das hatte ich nicht vor danke für den hinweis :slight_smile:

Habe wieder über Hterm die anfrage gesendet, dann funktioniert es, jedoch über den arduino springt er nicht mal in die if schleife "if (RS485Serial.available())".

Im Anhang Ausgabe mal die Ausgaben mit Serial Monitor & anfrage des Sensors über Hterm! (das delay steht nur auf 800 weil ich es bis 800 erhöht habe von 20 ab)

Im Anhang Problem könnte der mögliche Fehler liegen, ich gebe das was gesendet wird direkt wieder aus und bekomme ein y? Wie kann das sein?

Danke

hi,

will jetzt nicht nochmal alles durchlesen, aber...

hast Du eigentlich schon versucht, vom arduino den anforderungsstring direkt per wandler an den pc zu schicken ? was kam dort an?

gruß stefan

Also der Arduino empfängt alles, was auf dem Bus läuft. Das ist schon mal gut.
Aber da du auch im HTerm nichts von den Anfragen des Arduino siehst, wird der wohl nichts senden.

Ich vermute mal, dass der enable Pin nicht wirklich gesetzt wird.
Kommen denn die 5V am Pin 2/3 des RS485 Chips (U2) überhaupt an?
Miss doch das mal mit einem Multimeter nach....
Weil so lange wie dort nichts ankommt, wird der auch nichts auf den Bus senden.

Grüsse
Peter

Hi, ich habe nun endlich die Funktion gegeben die ich wollte. in einem früheren Beitrag habe ich ja geschrieben dass ich den Jumper an Header 3 auf D9_Ctrl gesteckt habe also eine Brücke auf Pin 2 und 3 des Headers. Habe es nun auf Tx_Ctrl (Header3 Pin 1 und 2 gebrückt) umgesteckt und jetzt ist die Funktion gegeben könnt ihr mir das erklären - eigentlich wird ja über D9 gesteuert.
Hier mein neuer Code dazu und ein Bild zu der Funktion des Programmes.

#include <SoftwareSerial.h>

const byte ENABLE_PIN = 9;
int i;

SoftwareSerial RS485Serial(2, 3);

void setup() {
  Serial.begin(9600);
  RS485Serial.begin(9600);
}

void loop() {
  
  digitalWrite (ENABLE_PIN, HIGH);
  RS485Serial.println("gettemperature!15");
  delay(10);  
  digitalWrite (ENABLE_PIN, LOW);
  
  if (RS485Serial.available()) {
    for(i=0;i<6;i++){
    if(i==0){
       Serial.println("Die Aktuelle Temperatur des Sensors betraegt:");
    }
    byte inByte = RS485Serial.read();
    Serial.write(inByte);    
    if(i==5){
       Serial.println("Grad Celsius\n"); 
    }
    }
  } 
  delay(5000); //5 Sekunden warten
}

Danke für eure Hilfe.

Werde nun als nächstes versuchen mit einem Arduino Motorshield in Abhängigkeit der erhaltenen Temperatur einen kleinen Motor anzusteuern.

Cool, dass es geklappt hat!

Das mit dem umstecken des Jumpers ist mir auch nicht ganz klar, aber Hauptsache es läuft :wink:

hi,

ich würde es so aus spaß mal versuchen, den sketch ohne das TX_ENABLE-dingens laufen zu lassen, also Pin 9 garnicht schalten.

wenn's auch ohne funktioniert, macht das shield das selbst irgendwie über den transistor (hab' ich ja schon auf der ersten thread-seite angesprochen).

wenn's nicht funktioniert, ist einfach der schaltplan falsch (hat's ja schon oft genug gegeben).

gruß stefan

Das werde ich mal noch ausprobieren aber glaube ganz ohne den Tx- enable wirds nucht funktionieren.

Gruß Marcel

jumper lassen, wo er ist und einfach die zwei zeilen zum pin9 schalten auskommentieren...