boonC Ответов: 1

Обновляйте метку gtk значения температуры каждую секунду


hello guys, i am c programming user. i have a project using raspberry Pi connect with sensors. i am currently stuck how to make the value update in second. i had tried using gtk_label_set_text and g_timeout_add_seconds. but the temperature unable update itsself once run, it need to close and rerun again ti get its update value. the below is the code i current make, please help me correct it if there is wrong. the project is only want C programming not other language. the below code are


#include <wiringPi.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <gtk/gtk.h>
#include <string.h>
#include <glib.h>


#define		BUFSIZE		128

// typedef unsigned char uchar;
// typedef unsigned int  uint;


float tempRead(void)
{
	float temp;
	int i, j;
    int fd;
	int ret;

	char buf[BUFSIZE];
	char tempBuf[5];
	
	fd = open("/sys/bus/w1/devices/28-0314979400b5/w1_slave", O_RDONLY);

	if(-1 == fd){
		perror("open device file error");
		return 1;
	}

	while(1){
		ret = read(fd, buf, BUFSIZE);
		if(0 == ret){
			break;	
		}
		if(-1 == ret){
			if(errno == EINTR){
				continue;	
			}
			perror("read()");
			close(fd);
			return 1;
		}
	}

	for(i=0;i<sizeof(buf);i++){
		if(buf[i] == 't'){
			for(j=0;j<sizeof(tempBuf);j++){
				tempBuf[j] = buf[i+2+j]; 	
			}
		}	
	}

	temp = (float)atoi(tempBuf) / 1000;

	close(fd);

	return temp;
}

int main(int argc, char *argv[])
{
	if(wiringPiSetup() == -1){
		printf("setup wiringPi failed !");
		return 1; 
	}
    float temp;
    while(1){
		temp = tempRead();
                char Str[100];
		// printf("Current temperature : %0.3f\n", temp);
                sprintf( Str, "Current temperature : %0.3f\n", temp);

     gboolean update_label_time (gpointer ptr) {
      // gchar *t = tempRead();
      gtk_label_set_text(GTK_LABEL(ptr), Str);
      // g_free (t);
      return G_SOURCE_CONTINUE;
    }


   gchar *t;
   GtkWidget *window;
   GtkWidget *label_time;

   gtk_init (&argc, &argv);
   GtkWidget *win = gtk_window_new (GTK_WINDOW_TOPLEVEL);

   gtk_window_set_default_size(GTK_WINDOW(win), 250, 150);

   // t = tempRead();
   // label_time = tempRead;
   // g_free (t);

   GtkWidget *lbl = gtk_label_new (Str);

   // g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
   gtk_container_add (GTK_CONTAINER (win), lbl);

   g_timeout_add_seconds(1.0, update_label_time, lbl);
   // tempRead = gtk_timeout_add_seconds(1.0, update_label_time, lbl))

   gtk_widget_show_all (win);

   gtk_main();
    }


}


Что я уже пробовал:

я все еще новичок в программе си, я не могу сказать слишком подробно. вы можете запустить этот код выше, если у вас есть датчик ds18b20.

markkuk

Почему вы продолжаете запускать новые темы с одним и тем же вопросом? Разве вы не читали ответы на предыдущие вопросы?

1 Ответов

Рейтинг:
0

OriginalGriff

Почему он закрывается? Потому что ты так сказал!
Посмотрите на свой код:

while(1){
       ...
       return G_SOURCE_CONTINUE;
    }
Когда main функция хитов return заявление, вот оно: программа заканчивается. Это именно то, что он предназначен делать.

И с тех пор ... return это единственный выход из вашего while цикл, код ниже этого цикла никогда, никогда не выполняется.

Перестаньте гадать: сядьте и подумайте о том, что именно вы пытаетесь сделать, спланируйте это вручную, а затем попытайтесь решить, как воспроизвести это в виде английских инструкций. Затем попробуйте "выполнить" эти инструкции на английском языке точно и посмотреть, работает ли это. Если это не так, улучшите инструкции и повторите попытку.
Когда они будут работать, начните переводить их в код и тестировать его.

Но в данный момент вы бросаетесь прямо в код, не думая о том, что вам нужно сделать, и это никогда не сработает.