String-Array-Wert an Funktion übergeben

Hallo,

glaube es ist sehr simpel, verstehe aber nicht, warum es nicht funktioniert...

Ich habe ein Array mit Strings, mit einer for Schleife möchte ich eine Unterfunktion aufrufen und ihr jedes Mal einen Wert aus dem Array übergeben:

tft.drawString(inputs[0], 15, 15,2);

Es kommt aber die Fehlermeldung:
TFT_HX8357_Due::drawString(String&, int&, int&, int)

Wenn ich einen String mit "Test" überebe geht es.

Also erkennt er nicht, dass inputs[0] ein string ist

Deklariert habe ich das so:
String inputs[50];

Wie muss ich das also richtig übergeben?

LG und danke schonmal

Was willst Du denn machen? Strings auf dem Arduino zu verwenden, ist keine gute Idee, wenn Du Deinen Speicher nicht zumüllen willst. 50 Stück davon erst recht nicht.
Schau Dir mal die Zeichenketten in C, also die Arrays of char an.

Gruß Tommy

Habe nen Due, er sollte das verpacken können

Mit char inputs[50]; und inputs als erstem Parameter sollte es gehen. Die Methode möchte einen Zeiger auf einen char-String haben:

int16_t TFT_HX8357_Due::drawString(char *string, int16_t poX, int16_t poY, int16_t font)

Dann ist aber die Fehlermeldung mit String blöd.

Gruß Tommy

Die Methode ist eventuell überladen so dass sie sowohl mit C Strings als auch mit String Objekten geht

Bei

tft.drawString(inputs, x, y,2);

kommt die fehlermeldung

no matching function for call to 'TFT_HX8357_Due::drawString(String [50], int&, int&, int)'

Deklariert habe ich das so:
String inputs[50];

Ein Array aus fünfzig String Objekten. Soso.
Und ausgeben willst du nur einen harmlosen kleinen Text?

Das passt nunmal nicht.

Tommy56:
Strings auf dem Arduino zu verwenden, ist keine gute Idee

Wenn ich einen String mit "Test" übergebe geht es.

"Test" ist ja auch kein String. Das ist wohl dein Denkfehler.

Wenn du jetzt erstmal String Objekte (und dann auch noch Arrarys davon) komplett vergisst, kriegst du es eventuell selber raus.
( Brauchst du eventuell nur einen Text mit bis zu 50 Buchstaben ? )

Oder du erklärst, warum du so etwas höllisch kompliziertes wie ein String Array unbedingt brauchst, und warum (und wie überhaupt?) du in dieses Array deine Texte reinkriegst, können wir zur Not auch mit String Objekten weitersehen. Aber z.Zt. führt das in die falsche Richtung glaube ich, deswegen mein Tip:
"Lass es, mach es einfacher, ohne String inputs[50]; "

Poste doch mal einen Minimalsketch und ein Link zur Lib.

Erfahrungsgemäß kommt man dadurch schon der Lösung näher.

Also ich möchte etwas über RS232 an den due senden und jedes Byte in ein Array schreiben, es sind immer 201 Bytes Also ein Array mit 201 Feldern. Wenn ich es mit HTerm mache geht es sehr gut. wenn ich es aber mit Powershell mache geht es vollkomen in die Hose. Ich habe noch gar keine Spur woran das liegen kann, da ich keine RS232 Befehle zurück bekommen, da ich es aus der Konsole starte.

Für HTerm kann ich vom Due alles empfangene wieder zurück schicken und so Input und Output vergleichen. um das aber über Powershell vergleichen zu können möchte ich es an einem Display anzeigen.

Hier die Bibliothek:

Hier der minimalcode

#include <TFT_HX8357_Due.h> 
TFT_HX8357_Due tft = TFT_HX8357_Due(); 
#define RS232IN 201
byte input[RS232IN];
int i,j,x,y;
void setup()
{
  Serial.begin(9600);
// Setup the LCD
  tft.init();
  tft.setRotation(1);
  tft.fillScreen(TFT_BLACK);
  tft.setTextColor(TFT_WHITE);
  }

void loop() {
  if (Serial.available()){
    Serial.readBytes(input, RS232IN);
   }
  displ();
}

void displ(){
  for(j=0;j<=12;j++){
   y=10+15*j;
  for (i=0;i<=14;i++){
  x=10+i*30;
  tft.drawString(input[i+15*j], x, y,2); // hier soll der wert in Hexadezimal angezeigt werden
  //tft.drawChar(input[i+15*j], x, y,2); //zeichnet leider nur das ascii zeichen
  }
   }
  y=205;
  for (i=0;i<=5;i++){
  x=10+i*30;
  tft.drawString(input[i+195], x, y,2);
  }
}

Also sende ich 201 Bytes an den Controller und er soll diese dann 1zu1 auf dem Display anzeigen.

  • Dass du immer 201 Bytes bekommst, ist schonmal zweifelhaft. Hängt sicher an deinem Powershell script und der Umgebung, wieviele Bytes 201 Buchstaben sind.
    Ich würde immerhin das Ergebnis von Serial.readBytes() auswerten.

  • Mich würde wundern, wenn eine Funktion namens drawString die Hex-Werte einer Serie von Bytes auf dein display zeichnet. Aber das ist deine Library. Geht das Display denn mit HTerm wie gewünscht ?

201 ist wichtig, da das quasi das Protokoll ist. 201 Bytes kommen rein und diese werden ausgewertet. wenn es nur 198 sind ist es nicht vollstädig und damit falsch wenn es 205 sind sind es 201 und ein zweiter Übertragungsvorgang mit 4 und damit unvollständig.

also die ganzen bytes sollen in ein array geschrieben werden und dann soll zum Beispiel

analogWrite(5, inputs[0]);
analogWrite(6, inputs[1]);
...

Weil 201 verschiedene sachen eingestellt werden müssen, müssen es auch immer 201 Bytes sein.

Ich möchte noch eine andere funktion schreiben, die aus dem Byte einen String macht, der halt passt also aus 00000000b -> 00h oder 11111111b -> FFh

Mit dem HTerm geht es natürlich auch nicht, da er ja so nicht die Funktion ausführen kann.

Wie werden die 201 Bytes terminiert?

Wie synchronisierst du das ganze, dass der Due weiss, wo die 201 Bytes anfangen?

Wass machst du, wenn nur 198 bzw. 205 kommen?

Hast du einen Logikanalyzer?

Also die 201 Bytes werden alle nacheinander direkt gesendet ohne delay.

Ich habe mir das als Timeout vorgestellt wenn eine Halbe sekunde nichts mehr kommt ist es fertig.

Wenn dann nicht 201 Bytes empfangen wurden ist es fehlerhaft und es soll einfach nichts passieren

Logiganalyzer habe ich leider nicht

Serial.readBytes() passt dann ja schon. Der hat einen Timeout als Ende-Kennung.
Wenn der default ( 1000 msec ) nicht passt, solltest du ihn passend einstellen, und auf jeden Fall beim Empfang prüfen ob das Datenpaket komplett war.

Da wir das Thema String nun vom Tisch haben, brauchst du nur noch eine Funktion, die dir die 201 Bytes hübsch im hex-Format auf dem Display anzeigt. Das baust du am einfachsten selbst, da weisst du was du hast.

ok, wäre aber schön, wenn man dafür trotzdem eine Lösung finden würde, es gibt ja bestimmt andere Fälle, wo man einer Funktion eine String Variable übergeben muss oder?

Wenn dann jemand die SuFu nutzt und sich freut, dass das schon jemand gefragt hat, dann aber feststellen muss, dass es keine Antwort gibt, ist das sehr unbefriedigend.

Es gibt eine Methode "String", mit der Du nich irritiert hast.

Zeichenketten bestehen aus einem Feld mit je einem Buchstaben je Feldelement.

Die Funktion/Methode drawString möchte als ersten Parameter einen Zeiger vom Typ char, sieht man am Sternchen. input hast Du aber mit byte deklariert.

Sobald mir ein Arduino über den Weg läuft, mache ich Dir auch ein Beispiel, wenn Du es bis dahin nicht selbst hinbekommen hast :slight_smile:

Also, für's Protokoll:
Ein String-Objekt ist nicht das was man als unbedarfter Arduino - Neuling meint.
Und ein String array wie z.B. dein String input[50]; schon erst recht nicht.

Ein Text ist üblicherweise ein char Array, wie zum Beispiel  const  char text[] = "Ein fester Text";

Oder auch ein reservierter Speicherplatz, der später gefüllt wird:

 char msg[20]; // Platz für max 19 Zeichen + Endekennung

Ein char* ist die Adresse eines solchen Texts, und kann meist genauso verwendet werden.
Bzw. ist das was an Funktionen übergeben wird.

Serial.println(text); // Gibt Ein fester Text aus.
char* teil = text+4;
Serial.println(teil); // Gibt fester Text aus.

McKaiver:
ok, wäre aber schön, wenn man dafür trotzdem eine Lösung finden würde, es gibt ja bestimmt andere Fälle, wo man einer Funktion eine String Variable übergeben muss oder?

Aber wie kommst du von dem auf ein Array aus String Objekten? Das ist etwas völlig anderes. Du bis mit den Datentypen völlig durcheinander und solltest dich da mal etwas mit den Grundlagen beschäftigen.

Es gibt Anwendungen wo man ein Array aus Bytes bekommt und da steht gleich ein C String in (d.h. es ist schon ASCII codiert). VirtualWire macht da so, damit Binär- und Text-Daten gleich behandelt werden. Dann reicht ein Cast und fertig.
Aber du scheinst hier wirklich erst mal Binär-Daten zu empfangen. Dann kannst du die nicht direkt anzeigen, sondern musst sie etwas aufbereiten und formatieren.

Ja, das verwirrt mich auf jeden Fall,

Also ist

string z="test";

"text" != z

denn sonst könnte ich ja die variable z anzeigen lassen. In der Variable z steht nämlich "3C"