Ich versuche, zu meinem g_main_loop eine neue Quelle hinzuzufügen, die ein Dateideskriptor auf einer peripheren seriellen Leitung ist.Benachrichtigung über Daten, die darauf warten, auf der seriellen Verbindung gelesen zu werden
Ich versuche, diesen Code:
GError* error;
GIOChannel* channel;
channel=g_io_channel_unix_new(fd_serial_line_dev);
g_io_add_watch(channel, G_IO_IN, cb_1, NULL);
g_io_channel_set_close_on_unref(channel, TRUE);
g_io_channel_set_encoding(channel, NULL, &error);
g_io_channel_set_buffered(channel, FALSE);
Der Rückruf ist:
gboolean cb_1 (GIOChannel *source, GIOCondition condition, gpointer data)
{
gchar** line=NULL;
GIOStatus status;
GError* error;
printf("cb\n");
status=g_io_channel_read_line(source, line, NULL, NULL, &error);
if(G_IO_STATUS_NORMAL == status)
{
printf("callback : data : %s\n", *line);
g_free(*line);
//g_io_channel_seek_position(source, 0, G_SEEK_CUR, NULL);
}
return TRUE;
}
Wenn ich Daten auf der seriellen Leitung schicken, ich eine Endlos-Schleife zu erhalten, die jede CB_1 Zeit nennen.
Ich sehe nicht, wo mein Fehler ist, erwartete ich, dass eine innerhalb Dateideskriptor der seriellen Leitung lesen stoppt während der nächsten g Haupt Schleifeniterationslatenzzeit an die Callback werden süffisant nennen ...
Von dem, was ich verstehe, sollten Sie auf einen Fehler zurückgeben, um den Kanal zu schließen. – TheAschr
Ich versuche und mit dieser Lösung wird Callback nie aufgerufen werden, auch wenn ein neues Zeichen kommt. Für mich ist die Rückgabe von FALSE nützlich, wenn die Ereignisquelle entfernt werden soll –