GTK 应用程序和串行端口处理程序

GTK 应用程序和串行端口处理程序

我正在嵌入式板上为 Linux 操作系统编写 GTK C 应用程序。

第一个主窗口打开一个串行(虚拟)端口,用于接收来自条形码阅读器的数据。我正在使用标准 open() 函数(在我的 OpenPort() 函数内)。然后我调用 g_io_channel_new_file() 和 g_io_add_watch() 来处理 rx 信号。

我真的需要标准的 open() 调用吗?

    if (g_config.fdRfid==-1)
        g_config.fdRfid = OpenPort( g_config.portRfid, B115200);

    if (g_config.fdRfid!=-1)
    {
        ShowMainMessage();
        
        GError *error = NULL;
        g_ioChannel = g_io_channel_new_file( g_config.portRfid, "r", &error);
        if (g_ioChannel)
        {
            guint source = g_io_add_watch( g_ioChannel, G_IO_IN | G_IO_PRI, serialRfidWatcher, &g_config);
            printf("> set watch ioCh: %p - source: %d\n", g_ioChannel, source);
        }
        else 
            gtk_label_set_text( GTK_LABEL(g_labelMsg2), error->message);

当我按下按钮时,我会打开一个对话框子窗口:在此之前,我通过 close() 函数关闭串行端口,并通过 g_io_channel_shutdown() 函数断开信号。返回的状态为 1 = G_IO_STATUS_NORMAL。

GIOStatus status = g_io_channel_shutdown( g_ioChannel, TRUE, NULL);
g_io_channel_unref(g_ioChannel);

if (g_config.fdRfid != -1) 
{
    ClosePort(&g_config.fdRfid);
}   

启动对话框窗口,我再次打开相同的端口(这是一个用于测试的窗口),并以与之前相同的方式重新连接 rx 信号。
现在,如果我在调试输出中读取条形码(通过 printf),我会看到主窗口的信号处理程序和对话框中的处理程序都被调用。

关闭对话框(关闭端口和通道...)我返回主窗口。如果我读取条形码,则会触发三个处理程序,两个在主窗口上,一个在对话框上。

如何断开信号处理程序?我认为我的方法不完整..

谢谢!

答案1

解决了!
我错过了电话

g_source_remove(source)

在结案程序中。
当然,我更改了该行以创建source全局变量:

/*guint*/ source = g_io_add_watch( g_ioChannel, G_IO_IN | G_IO_PRI, serialRfidWatcher, &g_config);

相关内容