Basado en el manual GIOChannel
El canal GIOChannel intenta de brindar un método portatil para el de diferentes medios de comunicación: pipes, descriptores de archivos, y zócalos. Además intenta de integrar su uso en el lazo principal del programa. Actualmente, sólo en Linux el soporte es completo, en Windows todavía quedan algunos problemas.
| Para crear un nuevo GIOChannel, se utiliza la función g_io_channel_unix_new() para conectar un canal con un archivo abierto. Esto funciona para los tres tipos de archivos. Alternativamente, se puede crear un archivo nuevo, en forma independiente del sistema, utilizando g_io_channel_new_file(). En el ejemplo, se abre un puerto serial, luego el canal. |
GIOChannel *ioch; fd = open(port, O_RDWR | O_NONBLOCK | O_NOCTTY); if (fd == -1) <mensaje de error y salida> ... ioch = g_io_channel_unix_new(fd); |
| Una vez creado el archivo, se puede leer ( g_io_channel_read_chars()), escribir ( g_io_channel_write_chars()), cambiar de posición ( g_io_channel_seek_position()), y cerrar el canal ( g_io_channel_close()). |
g_io_channel_write_chars(ioch, &cmd, 1, &written, &error);
g_io_channel_flush(ioch, NULL);
|
| Para evitar la necesidad de controlar el canal continuamente, se pueden declarar funciones que serán llamados al producirse el evento correspondientes con g_io_add_watch() o g_io_add_watch_full(). |
int iowatch = -1;
iowatch = g_io_add_watch(ioch, G_IO_IN, io_callback, NULL);
|
| En este caso es necesario de definir una función que será llamada cuando se produce el evento (en este caso, io_callback será llamada cuando se produce el evento 'G_IO_IN', i.e. cuando entran caracteres por el canal. |
gboolean
io_callback(GIOChannel *ioch, GIOCondition cond, gpointer data)
{
int bytes_read;
unsigned char chr;
do {
g_io_channel_read_chars(ioch, &chr, 1, &bytes_read, NULL);
if (bytes_read) {
process_char(chr);
if (pref.diag_comm) printf("%02x\n", chr);
}
} while (bytes_read);
return TRUE;
}
|
El código completo para este ejemplo está aquí. Por favor tome nota que no se trata de un programa completo! Todavía tendrá que agregar un programa principal y codigo que utiliza los datos de alguna forma. Esto no es un curso de C!
1009
| (c) John Coppens ON6JC/LW3HAZ | correo |