UART + DC-SS500

Hallo,

ich möchte mit dem DC-SS500 von Sure Electronics per UART die relative Luftfeuchtigkeit + Temperatur auslesen.

Das Problem ist, das ich für die ersten fünf Abfragen Ergebnisse bekomme, dann bekomm ich nichts mehr. Läuft hier ein Puffer o.ä. voll?

023Centigrade
023Centigrade, 073Fahrenheit
test
023Centigrade
023Centigrade, 073Fahrenheit
test
023Centigrade
023Centigrade, 073Fahrenheit
test
023Centigrade
023Centigrade, 073Fahrenheit
test
023Centigrade
023Centigrade, 073Fahrenheit
test
023Centigrade
test
test
test
test
test

Datenblatt: http://www.sure-electronics.net/download/DC-SS500_Ver1.0_EN.pdf

Verkabelung:
Arduino 5v -> DC-SS500 5v
Arduino GND -> DC-SS500 5v
Arduino RX -> DC-SS500 TX
Arduino D2 -> DC-SS500 RX

Code:

#include <SoftwareSerial.h>

#define rxPin 12 // actually, I am not using a rxPin
#define txPin 2

// set up a new serial port
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);

int get_str(char *s, int ms);
int str_to_int(char *s);

void setup()
{
// define pin modes for tx, rx, led pins:
pinMode(txPin, OUTPUT);
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
Serial.begin(9600);
}

void loop()
{
char s[30];
int T, RH;

// measure and display the temperature in degrees F
mySerial.println("$sure temp");
get_str(s, 100);
Serial.println("test");
delay (1000);
// Now the same for the relative humidity,
mySerial.println("$sure temp -c");
get_str(s, 100);
delay(1000);

}

int get_str(char *s, int ms)
{
char ch;
int n=0;

while(ms--)
{
while (Serial.available() > 0)
{
Serial.print(char(Serial.read()));
if ((ch == 0x0a) || (ch == 0x0d)) // CR or LF
{
s[n] = 0; // null terminate the string
return(n);
}

}

}
}

Ich fürchte, deine Annahme ist richtig. Wenn du die Hauptschleife so mit Pausen zupflasterst, kann das der Grund sein.

Danke für den Tipp.
Wenn ich das erste delay() rausnehme und das Zweite auf 10ms reduziere, bekomme ich zwar mehr ausgaben, aber irgendwann ist dann auch schluss.

Wenn ich das Sensormodul vom Strom trenne, gehts wieder.

Hat jemand eine Idee?

Hallo dots

Du hast einiges Durcheinander in Deinem Post:

Der DC-SS500 hängt:
an Pin 1 für TX und Pin 12 für RX ??
oder an Pin 2 und 12 des Arduino ??
Bitte mach nicht dieses Durcheinander indem Du 2 serielle Schnittstellen verwendest und die TX über die eine und RX über die andere schickst.
mySerial.println("$sure temp"); laut Datenblatt mußt Du ein Return senden ( 0x0d und 0x0a ) siehe Note1 Datenblatt Seite 5 (leider kann man nichts vom Datenblett kopieren. Haben die Angst ich kopiere ihnen was weg? >:( )

 if ((ch == 0x0a) || (ch == 0x0d)) // CR or LF
          {
             s[n] = 0; // null terminate the string
             return(n);
          }

Diese Code hat keinen Sinn da Du der Variable ch ja nur einmal den Wert 0 zuweist.

Auch diese Konstrukt hat wenig sinn:

while(ms--)
   {
     while (Serial.available() > 0)
      {

Sinnvoller finde ich:

  • Du sendest die Anfrage auf Daten
  • Kurze Wartezeit
  • Du liest die Daten von der serielle Schnittstelle mit
while (Serial.available() > 0)
      {
        Serial.print(char(Serial.read()));
      }

fertig.
Falls Du sie in eine Variable speichen möchtest:

while (Serial.available() > 0)
{
ch[n]= (Serial.read();
Serial.print(char(ch[n]);
n++;
}

Und bitte scheribe einen sauberen Kode und verwende nicht 2 Schnittstellen um die Daten zu Senden/Empfangen.

Grüße Uwe

Hallo Uwe,

danke für Dein Feedback. Wenn ich eine serielle Schnittstelle verwende habe ich folgendes Problem:

Ich sende: $sure temp- c
Ich lese (und sende gleichzeitig): 023Centigrade, 073Fahrenheit
Ich bekomme dann: Bad Command!, weil 023Centigrade, 073Fahrenheit nicht als UART Kommando interpretiert werden kann.

Hallo dots

Ich verstehe Dich und Dein Problem nicht. :wink:
Die Software-serielle Schnittstelle hat eine Sendeleitung und eine Empfangsleitung RX und TX.
Diese Pins definierst Du in der Funktion SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);
In Sendestring bitte sende auch ein 0x0d und ein 0x0a als Ende von "$sure temp- c". Das schätze ist das Problem der abgebrochenen Datenübertragung.
Grüße Uwe

So?

mySerial.print("$sure temp -c");
mySerial.print(0x0d,HEX);
mySerial.print(0x0a,HEX);

Da bekomme ich nen Fehler "Bad Command"

Ist ein 0x0d 0x0a nicht ein "carriage return" "new line" dass ja println() in Gegensatz zu print() macht?

Da überrascht Du mich in meiner Unwissenheit.

Du hast Recht:

println()
Prints data to the serial port as human-readable ASCII text followed by a carriage return character (ASCII 13, or '\r') and a newline character (ASCII 10, or '\n'). This command takes the same forms as Serial.print().

Entschuldige, das war mein Fehler.

Sicher falsch ist das ",hex" im print. So übergibst Du die Zahl als hex-Wert formatiert ( eine "null" und ein "d" bzw "a").
Funktioniern müßte

mySerial.print(0x0d);
mySerial.print(0x0a);

retorische Frage:"also was ist dann das Problem?"

Hast Du es mit einer kleinen Pause zwischen Comando senden und Wert empfangen versucht?

Grüße Uwe

noch nicht, das werde ich morgen mal machen, mein Bett ruft :wink:
Wenn ich das HEX weglasse, ändert sich leider auch nichts.

Warum die Datenübertragung nach 5-6 Übertragungen schlapp macht, stellt mich echt vor ein Rätsel. Ich hab jetzt 2 verschiedene Module und zwei verschiede Boards ausprobiert. Sobald ich GND bei dem Modul ziehe, bekomme ich wieder 5-6 Rückmeldungen. Je länger die Pause (delay) zwischen den Abfragen, desto weniger Ergebnisse bekomme ich.

Eigentlich benötige die Werte alle 10-30 Minuten.

Grüße
Patrick