Messwert Abfrage über RS232

Hallo,

ich bin vergeblich dabei Messwerte eines Messgeräts über ein RS232 Shild (Joy-it RS232 Shild) mit SoftwareSerial ab zu Fragen.

Ich bekomme leider keine Antwort von dem Messgerät.

Daten vom Messgrät
Baud 9600
8 bit
no parity
1 stop bit

Eigentlich auch xon xoff Flow Control, aber ich habe es mit Putty über einen PC getestet, es funktioniert auch wenn die Flow Control aus ist.

die Syntax zu Messwert Ausgabe ist

ech #\ num tim val ulb

Die Antwort wäre dann und ist sie auch mit Putty z. B.

#1 12:45:45 1.2345E-06 mbar

Wenn ich das Arduino mit Putty verbinde und Empfange was gesendet wird kommt auch genau die Syntax an.

Das sind leider meine ersten Gehversuche mit RS232 am Arduino ich hoffe es ist nur ein kleiner Denkfehler.

Anbei noch der Code und im Anhang ist die Dokumention vom Messgerät.

Vielen Dank im Vorraus.

//delay Ersatz
unsigned long currentMillis = 0;              
unsigned long AbfrageIntervall = 5000;         
unsigned long previousMillisAbfrage; 


SoftwareSerial RS232(3, 2);

char rs232_inChar;
//char rs232_Abfrage = "ech #\ num tim val ulb";  //Alternativ 



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

  RS232.begin(9600);
}

void loop()
{

  currentMillis = millis(); //Delay ersatz 

  if ( currentMillis - previousMillisAbfrage > AbfrageIntervall) 
  {

    
    String rs232_Abfrage = String(String ("ech ") + char(35) + char(92) + " num tim val ulb");
    
    RS232.print(rs232_Abfrage);
    Serial.println();
    Serial.println(rs232_Abfrage);
    Serial.println("Abfrage");
    

    rs232_inChar = RS232.read();            
     
            
    Serial.print(rs232_inChar); 
	
    previousMillisAbfrage = currentMillis;
  }

   
      


  
}

RS232-Interface.pdf (726 KB)

Hmm..
Welcher der Partner ist ein DTE und welcher ein DCE?
Diese Überlegung sollte dann zu einem Verkabelungsplan führen.

Hast Du die Jumper falsch gesteckt oder RxD und TxD vertauscht?

Hallo,

Versuchsweise RX un TX mal auf einer Seite tauschen.

Heinz

combie:
Hmm..
Welcher der Partner ist ein DTE und welcher ein DCE?
Diese Überlegung sollte dann zu einem Verkabelungsplan führen.

Hallo Combie,

PC ist DTE Messgerät DCE am Arduino hatte ich beides Probiert.

agmue:
Hast Du die Jumper falsch gesteckt oder RxD und TxD vertauscht?

Hallo agmue,

Nein die sind richtig bzw ich habe auch schon ohne die Jumper direkt mit Kabel verbunden.
RX und TX wurden auch schon getauscht.

Passt den mein Code auf den ersten Blick ?

Passt den mein Code auf den ersten Blick ?

Nein. read() liest nur ein Zeichen aus. Damit kannst du so einfach keinen String einlesen. Mit direkter Ausgabe mag das vielleicht irgendwann ankommen. Aber damit kannst du nichts auswerten

Text der gesendet wird wird wie üblich mit CR + LF abgeschlossen wenn ich das richtig sehe. Damit muss man nur solange einlesen bis das LF da ist:

const unsigned int READ_BUFFER_SIZE = 21;    //Platz für 20 Zeichen + Terminator

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

void loop()
{
  char* str = readLine(Serial);  //liefert true wenn das LF eingelesen wurde
  if (str != nullptr) 
  {
    Serial.print("Eingelesen: ");
    Serial.println(str);
  }
}

char* readLine(Stream& stream)
{
  static byte index;
  static char buffer[READ_BUFFER_SIZE];

  while (stream.available())
  {
    char c = stream.read();

    if (c == '\n')              //wenn LF eingelesen
    {
      buffer[index] = '\0';     //String terminieren
      index = 0;
      return buffer;            //melden dass String fertig eingelesen wurde
    }
    else if (c >= 32 && index < READ_BUFFER_SIZE - 1)   //solange noch Platz im Puffer ist
    {
      buffer[index++] = c;    //Zeichen abspeichern und Index inkrementieren
    }
  }
  return nullptr;               //noch nicht fertig
}

Das fragt einfach immer wieder ab ob ein Zeichen im Eingangspuffer ist. Wenn ja wird das Zeichen in ein Array kopiert. Wenn nein bricht die Funktion gleich wieder ab. Wenn das Endzeichen eingelesen wurde meldet man dass man fertig ist und kann dann den String Parsen

Serenifly:
Nein. read() liest nur ein Zeichen aus. Damit kannst du so einfach keinen String einlesen. Mit direkter Ausgabe mag das vielleicht irgendwann ankommen. Aber damit kannst du nichts auswerten

Text der gesendet wird wird wie üblich mit CR + LF abgeschlossen wenn ich das richtig sehe. Damit muss man nur solange einlesen bis das LF da ist:

const unsigned int READ_BUFFER_SIZE = 21;    //Platz für 20 Zeichen + Terminator

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

void loop()
{
 char* str = readLine(Serial);  //liefert true wenn das LF eingelesen wurde
 if (str != nullptr)
 {
   Serial.print("Eingelesen: ");
   Serial.println(str);
 }
}

char* readLine(Stream& stream)
{
 static byte index;
 static char buffer[READ_BUFFER_SIZE];

while (stream.available())
 {
   char c = stream.read();

if (c == ‘\n’)              //wenn LF eingelesen
   {
     buffer[index] = ‘\0’;     //String terminieren
     index = 0;
     return buffer;            //melden dass String fertig eingelesen wurde
   }
   else if (c >= 32 && index < READ_BUFFER_SIZE - 1)   //solange noch Platz im Puffer ist
   {
     buffer[index++] = c;    //Zeichen abspeichern und Index inkrementieren
   }
 }
 return nullptr;               //noch nicht fertig
}



Das fragt einfach immer wieder ab ob ein Zeichen im Eingangspuffer ist. Wenn ja wird das Zeichen in ein Array kopiert. Wenn nein bricht die Funktion gleich wieder ab. Wenn das Endzeichen eingelesen wurde meldet man dass man fertig ist und kann dann den String Parsen

Hallo Serenifly,

Vielen Dank für den Code habe ich mit übernommen.
Falls der Text doch nicht mit LF abgeschlossen wird, kann ich ja auch nach einer bestimmten Zeit den Buffer abschließen und ausgeben.

Aber ich bekomme leider immer noch keine Antwort vom Messgerät.

Der Teil mit der Abfrage in meinem Code ist aber soweit richtig, oder ist hier auch ein Fehler?

Edit:
Habe gerade selbst noch was gefunden was fehlt.
Es muss nach dem gesendeten Befehl noch ein CR gesendet werden aber, aber auch damit bekomme ich keine Antwort.

Es muss nach dem gesendeten Befehl noch ein CR gesendet werden

Wie tust du das?

combie:
Wie tust du das?

Ich habe dem char ein \r angehängt auch extra nochmal mit RS232.print("\r"); gesendet.
Habe es auch mit RS232.print(char(13)); probiert.

Habe auch bei allen Versuchen jeweils einmal mit "umgekehrten" RX TX probiert.

Aber es kommt keine Antwort.

Es geht doch nichts über eine ordentliche Diagnose.

Hast du noch einen USB UART Adapter?
Einen zweiten Arduino?
Oder einen LA (LogikAnalyser)?

combie:
Es geht doch nichts über eine ordentliche Diagnose.

Hast du noch einen USB UART Adapter?
Einen zweiten Arduino?
Oder einen LA (LogikAnalyser)?

Einen zweiten Arduino habe ich ja.
Einen USB UART Adapter kann ich evtenuell kurzfristig auftreiben.

Einen PC mit nativen COM Port hätte ich auch noch.

Einen PC mit nativen COM Port hätte ich auch noch.

Perfekt!

Hallo an alle,

ich habe den Fehler gefunden ich hatte einen Denkfehler bezüglich des drehens von RX und TX.
Es reicht beim MAX232 nicht RX und TX hinter dem Chip zu drehen es muss in der Leitung vom Partner zum Shild gedreht werden dann Funktioniert alles.

Vielen Dank für die Unterstüzung.

Naja...
Da hätte es evtl. geholfen einen "Verkabelungsplan" zu malen, und den dann evtl auch hier zu zeigen.

Aber ok, hat ja auch ohne geklappt.