Starten eines Programms mit Übergabe von Parametern

shtlcd

Grünschnabel
Hallo,

ich möchte gerne die Daten eines Temperatur- und Feuchtigkeitssensors auf einem LCD Display darstellen. Beide Peripheriegeräte befinden sich an einem Raspberry Pi.

Ich habe ein C Programm des Sensors, welches ich selber für das starten auf einem Raspberry Pi kompiliert habe. Nun möchte ich dieses C Programm dahingehend erweitern, dass es ein weiteres bereits kompiliertes C Programm des lcd displays, welches im selben Ordner liegt, parallel mit startet.

Außerdem sollen beim starten des zweiten C Programms 4 Parameter aus dem 1. Sensor Programm mit übergeben werden.
Die Parameter sind 2 chars (Textstring) und 2 floats (Temperatur- und Feuchtigkeitswerte), wobei die 2 floats als Variable aus dem 1. C Programm eingelesen werden sollen.

Ich hoffe das nicht zu kompliziert beschrieben zu haben. Daher hier nochmal mein Lösungsansatz mit dem es aber nicht klappt:

system("./lcd" "Temperatur" "var_temp" "Luftfeuchtigkeit" "var_lf");

Ich bin in C ein kompletter Anfänger und hoffe daher auf eure Hilfe.

Danke !

Gruß Andreas
 
Hallo shtlcd

Grundsätzlich kannst du dir den String folgendermassen zusammensetzen:
C:
char startupString[255];
sprintf(startupString, "./lcd Temperatur %f Luftfeuchtigkeit %f", var_temp, var_lf);
system(startupString);

Viele Grüsse
Cromon
 
Danke !

Es klappt :)

Eine Frage noch...

Wenn ich folgenden code habe:

int main ()
{
programm;
return 1;
}

Wie schaffe ich es das das Programm sich alle 60s von alleine neu startet. Am besten im Hintergrund ohne Ausgabe auf der Konsole.

Danke schonmal !
 
Zuletzt bearbeitet:
C:
while(1)
{
    clock_t c = clock();
    programm();
    Sleep(60000-(clock()-c));
}
Oder einfacher und unpräziser:
C:
while(1)
{
    programm();
    Sleep(60000);
}

Gruss
cwriter
 
Hi cwriter,

welche Header muss für die Funktion Sleep() eingebunden werden? Ich kannte bisher nur sleep() aus unistd.h und das wird mit Sekunden und nicht Millisekunden gefüttern. Es gibt statt dessen noch usleep() (auch unistd.h), aber das verwendet Mikrosekunden.
 
@saftmeister
#include <Windows.h>
:)

usleep() wäre die korrekte POSIX-Funktion (mit Werten * 10).

Gruss
cwriter
 
Der TO verwendet aber anscheinend Linux ;-) Wenn man sich den system() Aufruf mal genau ansieht.

usleep() muss dann mit *1000 Millis gefüttert werden. Mikro ist ein Millionstel. Also entweder

Sekunden * 1000000

oder

Millisekunden * 1000
 
Baaah, gibt's da echt keine ms? Ich finde ms das angenehmere Zeitformat. Sekunden sind schlicht zu gross, aber mit us kriegt man relativ schnell Probleme mit den 4 Bytes...
Die Werte *1000, ja. Ich schlafe schon früh...
Linux: Ich würde noch weiter gehen und auf Raspbian tippen ;-)

Gruss
cwriter
 
Was AFAIK auch "nur" ein Debian oder Ubuntu ist.

Nur mit etwas selbst gebautem:

C:
#include <unistd.h>

/**
 * Sleep a given time in milliseconds
 *************/
int sleepms(int ms)
{
  return usleep(ms * 1000);
}
 
Baaah, gibt's da echt keine ms? Ich finde ms das angenehmere Zeitformat. Sekunden sind schlicht zu gross, aber mit us kriegt man relativ schnell Probleme mit den 4 Bytes...
Das ist einer der Gründe, wieso usleep als überholt gilt. Reicht eine Auflösung von einer Sekunde, verwendet man besser das bereits erwähnte sleep, Nanosekundenauflösung erreicht man mit nanosleep. Bei beiden sollte man den Rückgabewert verwenden um festzustellen, ob die volle Dauer gewartet wurde oder nur ein Teil davon.

Grüße
Matthias
 

Neue Beiträge

Zurück