GUI本身启动正常。每次按下按钮时,都会调用一个函数,该函数通过SPI与DAC进行通信。如果按下按钮并且函数gtk_spin_button_get_value_as_int()
返回0,则会出现错误。
但是按钮本身就可以工作。
错误讯息:
Gtk-CRITICAL **:gtk_spin_button_get_value_as_int:断言'GTK_IS_SPIN_BUTTON(spin_button)'
这是我的源代码:
#include<stdio.h>
#include<wiringPi.h>
#include<gtk/gtk.h>
#define SPAM 1
#define SPIDELAY 500
#define CPLDSPEED 500000
#define DACSPEED 500000
GtkWidget *g_lbl_hello;
GtkWidget *g_lbl_count;
GtkWidget *spin1,*spin2,*spin3,*spin4,*spin5;
int channel1,dac1=0;
int channel2,dac2=0;
int channel3,dac3=0;
int channel4,dac4=0;
int dac5=0;
//Konvertierung der Adresse zum Sendeformat
char createAdress(int channel,int dac){
char aout;
int test;
test=(channel*16)+dac;
aout=(channel*16)+dac;
printf("\n\nAdeDEC:%i\n",test);
printf("Adresse:Fx%0x\n\n",aout);
return aout;
}
//Kovertierung des DACWertes zum Sendeformmat
char *createValue(short dacvalue){
static char vout[1];
vout[1]=dacvalue & 0xFF;
vout[0]=dacvalue>>8;
printf("\n\nWert:Fx%02x%02x\n\n",vout[0],vout[1]);
return vout;
}
void write_dac(int value,int dac,int channel){
//Sendeformat der Adresse
unsigned char a[0];
printf("Schalte CS für DAC%i%i LOW\n",channel,dac);
a[0]=createAdress(channel,dac);
wiringPiSPIDataRW(0,a,1);
printf("Schreibe Wert %hu auf den DAC%i%i",value,channel,dac);
wiringPiSPIDataRW(1,createValue(value),2);
printf("Schalte CS für DAC%i%i HIGH\n",channel,dac);
a[0]=0x00;
wiringPiSPIDataRW(0,a,1);
}
int main(int argc, char *argv[]){
//Sendeformat des DAC-Wertes
unsigned char *v;
//Zwischenspeicher für die Daten
unsigned short value;
int channel,dac, spilocj=0;
//SPI Setup
wiringPiSetup();
//Kommunikation mit CPLD wird eingerichtet
if (wiringPiSPISetup(0,CPLDSPEED)==-1)
{
printf("Du hast was falsch gemacht beim CPLDSPI\n");
}
//Kommunikation mit DAC wird eingerichtet
if (wiringPiSPISetup(1,DACSPEED)==-1)
{
printf("Du hast was falsch gemacht beim DACSPI\n");
}
GtkBuilder *builder;
GtkWidget *window;
gtk_init(&argc, &argv);
builder = gtk_builder_new();
gtk_builder_add_from_file (builder, "Testgui.glade", NULL);
window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
gtk_builder_connect_signals(builder, NULL);
g_object_unref(builder);
gtk_widget_show(window);
gtk_main();
return 0;
}
void prg_dac1(){
write_dac(gtk_spin_button_get_value_as_int(spin1),1,2);
}
void prg_dac2(){
write_dac(gtk_spin_button_get_value_as_int(spin2),2,2);
}
void prg_dac3(){
write_dac(gtk_spin_button_get_value_as_int(spin3),3,2);
}
void prg_dac4(){
write_dac(gtk_spin_button_get_value_as_int(spin4),4,2);
}
void prg_dac5(){
write_dac(gtk_spin_button_get_value_as_int(spin5),5,2);
}
这是我的Gladeproject保存为GtkBuilder文件:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkAdjustment" id="dacwerte1">
<property name="upper">65535</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkAdjustment" id="dacwerte2">
<property name="upper">65535</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkAdjustment" id="dacwerte3">
<property name="upper">65535</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkAdjustment" id="dacwerte4">
<property name="upper">65535</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkAdjustment" id="dacwerte5">
<property name="upper">65535</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<child>
<object class="GtkGrid" id="grid2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">DAC2</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">DAC3</property>
</object>
<packing>
<property name="left_attach">2</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">DAC4</property>
</object>
<packing>
<property name="left_attach">3</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label8">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">DAC5</property>
</object>
<packing>
<property name="left_attach">4</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="prg_dac1" swapped="no"/>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button2">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="prg_dac2" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button3">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="prg_dac3" swapped="no"/>
</object>
<packing>
<property name="left_attach">2</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button4">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="prg_dac4" swapped="no"/>
</object>
<packing>
<property name="left_attach">3</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button5">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="prg_dac5" swapped="no"/>
</object>
<packing>
<property name="left_attach">4</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkToolbar" id="toolbar1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="toolbar_style">icons</property>
<property name="icon_size">10</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
<property name="width">5</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="DAC">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">DAC1</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spin1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">5</property>
<property name="invisible_char">●</property>
<property name="activates_default">True</property>
<property name="width_chars">10</property>
<property name="invisible_char_set">True</property>
<property name="adjustment">dacwerte1</property>
<property name="climb_rate">1</property>
<property name="update_policy">if-valid</property>
<signal name="editing-done" handler="set_dac1" swapped="no"/>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spin5">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">5</property>
<property name="invisible_char">●</property>
<property name="width_chars">10</property>
<property name="invisible_char_set">True</property>
<property name="adjustment">dacwerte5</property>
<property name="climb_rate">0.02</property>
<property name="numeric">True</property>
</object>
<packing>
<property name="left_attach">4</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spin4">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">5</property>
<property name="invisible_char">●</property>
<property name="width_chars">10</property>
<property name="invisible_char_set">True</property>
<property name="adjustment">dacwerte4</property>
<signal name="editing-done" handler="set_dac4" swapped="no"/>
</object>
<packing>
<property name="left_attach">3</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spin3">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">5</property>
<property name="invisible_char">●</property>
<property name="width_chars">10</property>
<property name="invisible_char_set">True</property>
<property name="adjustment">dacwerte3</property>
<property name="update_policy">if-valid</property>
<signal name="editing-done" handler="set_dac3" swapped="no"/>
</object>
<packing>
<property name="left_attach">2</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spin2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">5</property>
<property name="invisible_char">●</property>
<property name="width_chars">10</property>
<property name="invisible_char_set">True</property>
<property name="input_purpose">number</property>
<property name="adjustment">dacwerte2</property>
<property name="wrap">True</property>
<signal name="editing-done" handler="set_dac2" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkWindowGroup" id="windowgroup1"/>
</interface>
另外,我收到有关GtkWidget
指针spin1
等数据类型的编译警告。但是将数据类型更改为适当的GtkSpinButton
也无济于事。
main.c:在函数'prg_dac1'中:main.c:116:45:警告:传递 “gtk_spin_button_get_value_as_int”的参数1来自不兼容 指针类型write_dac(gtk_spin_button_get_value_as_int(spin1),1,2); ^在/usr/include/gtk-3.0/gtk/gtk.h:185:0中包含的文件中, 来自main.c:4:/usr/include/gtk-3.0/gtk/gtkspinbutton.h:194:7:注意:预期'结构 GtkSpinButton *'但参数类型为'struct GtkWidget *'gint gtk_spin_button_get_value_as_int(GtkSpinButton * spin_button);
答案 0 :(得分:0)
您永远不会将spin1
等分配给Glade文件中的对象。请看gtk_builder_get_object()
。
要删除类型警告,请在调用站点使用显式转换,并将变量类型保留为GtkWidget。 GTK +提供了您可以使用的特殊宏:
write_dac(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin1)),1,2);