Raspberry Pi In C system() verwenden um Kommandobefehle auszuführen und Inhalt speichern

Gast #4780460
Lesenswert?

Hallo,

ich habe folgendes Problem. Auf dem Raspberry Pi können über das 
Terminal gewisse Daten wie zum Beispiel die CPU Temperatur ausgegeben 
werden. Das funktioniert auch soweit.


Diese Befehle möchte ich in C integrieren. Das geht ja ganz einfach über 
system().

Hier der Code für die Temperatur zum Beispiel:
1
#include <stdlib.h>
2
#include <stdio.h>
3
#include <string.h>
4

5

6
int main() 
7
{
8
  system("cat/sys/class/thermal/thermal_zone0/temp");
9
  
10
  
11
  
12
  return(0);  
13
}

Dann bekomm ich auch eine Temperatur im Terminal angezeigt. 52000 zum 
Beispiel, also 52 Grad Celsius. Nun möchte ich aber gerne diesen Wert in 
eine Variable speichern um sie später über ein File zu übergeben.


Habe dazu leider keine Lösung gefunden.



Grüße
Gast #4780472
Lesenswert?

Hi, Du kannst einfach den Wert in ein File schreiben mit

system("cat/sys/class/thermal/thermal_zone0/temp > Wert.out");

dann legt jeder Aufruf den Wert in Wert.out ab. Mit

system("cat/sys/class/thermal/thermal_zone0/temp >> Wert.out");

wird das Ergebnis an die neue Datei angefügt!
Gast #4780484
Lesenswert?

Guest schrieb:
> Habe dazu leider keine Lösung gefunden.

warum liest du den Inhalt nicht einfach aus

/sys/class/thermal/thermal_zone0/temp

was anders macht cat auch nicht. Also einfach die Datei öffnen ( fopen) 
und sie auslesen, dafür System zu missbrauch ist doch ziemlich sinnlos.
Gast #4780501
Lesenswert?

MBr schrieb:
> Hi, Du kannst einfach den Wert in ein File schreiben mit
>
> system("cat/sys/class/thermal/thermal_zone0/temp > Wert.out");
>
> dann legt jeder Aufruf den Wert in Wert.out ab. Mit
>
> system("cat/sys/class/thermal/thermal_zone0/temp >> Wert.out");
>
> wird das Ergebnis an die neue Datei angefügt!

Das sind aber c++ befehle oder?
Ich arbeite in ANSI C.
Gast #4780511
Lesenswert?

Peter II schrieb:
> Guest schrieb:
>> Habe dazu leider keine Lösung gefunden.
>
> warum liest du den Inhalt nicht einfach aus
>
> /sys/class/thermal/thermal_zone0/temp
>
> was anders macht cat auch nicht. Also einfach die Datei öffnen ( fopen)
> und sie auslesen, dafür System zu missbrauch ist doch ziemlich sinnlos.

Vielen Dank. Bin nicht ganz fit mit den Terminalbefehlen.

Das bedeutet ich öffne einfach nacheinander die Dateien und schreibe mir 
den Wert weg.

Danke
Gast #4780532
Lesenswert?

So bekomme ich schonmal die Temperatur und das Modell:
1
  GPIO = fopen("/sys/class/thermal/thermal_zone0/temp", "r");
2
  fgets(Daten, sizeof(Daten), GPIO);
3
  fclose(GPIO);
4
  printf("Temperatur ist:\n");
5
  printf("%s", Daten);
6
  
7
  GPIO = fopen("/sys/firmware/devicetree/base/model", "r");
8
  fgets(Daten1, sizeof(Daten1), GPIO);
9
  fclose(GPIO);
10
  printf("Pi Model ist:\n");
11
  printf("%s", Daten1);

Jetzt hab ich aber nich Befehle wie:


CPU Spannung:

vcgencmd measure_volts

Und CPU Frequenz:

vcgencmd measure_clock arm


Wie kann ich das lösen. Mit diesen >> Operatoren hab ich noch nie 
gearbeitet. Versteh nicht ganz wie ich das damit in eine Variable 
speicher.


Grüße
Moderator Persönliche Seite #4780583
Lesenswert?

Guest schrieb:
> So bekomme ich schonmal die Temperatur und das Modell:

Gut. Du solltest den Filepointer nach dem fopen noch prüfen, ob der Open 
denn auch funktioniert hat. Sonst crasht Dein Programm beim 
nachfolgenden fgets().

> Jetzt hab ich aber nich Befehle wie:
>
> CPU Spannung:
>
> vcgencmd measure_volts
>
> Und CPU Frequenz:
>
> vcgencmd measure_clock arm

Du musst also hier doch die Ausgabe eines externen Programms auswerten.

Erste Möglichkeit:

Du rufst das Programm mit Umlenkung auf eine Datei auf, also zum 
Beispiel:

  system ("vcgencmd measure_volts >/tmp/volts");

und liest dann die Datei /tmp/volts aus - genauso wie Du das mit fopen() 
und fgets() für die Temperatur gemacht hast.

Zweite Möglichkeit:

Diese wäre dann schon höhere Programmierkunst. Du öffnest aus Deinem 
Programm eine Pipe zu dem externen Programm per fork(), dup(), exec() 
und liest direkt vom Programm - genau so, wie eine Shell die Ausgabe 
eines Programms per Pipe an ein anderes Programm weitergibt.

Aber wie ich Deinen Wissensstand einschätze, ist das noch zu früh für 
Dich. Benutze also Möglichkeit 1. Die ist trivial. Wenn Dich der feste 
Name /tmp/volts stört (auf Mehrbenutzersystemen könnte es da schon mal 
zu Konflikten kommen), schau Dir das Manual zu mktemp() an. Das wäre 
aber dann erst im nächsten Schritt zu tun.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren