【发布时间】:2018-06-28 01:33:51
【问题描述】:
我有以下问题:
我通过 UART(每 10 毫秒)接收传感器数据,我想在 gtk 中处理这些数据。这个想法是以特定的时间间隔(例如每 100 毫秒)处理这些数据。因此,我使用 g_timeout_add() 函数。 被调用的函数包含用于 UART 通信的通用集 -> 在我的情况下,它会阻塞,直到我收到 10 个字符。 这就是问题所在 - 在我的 read() (-> 系统调用) 函数中,程序挂断了。
我的串口设置如下:
struct termios oldtio,newtio;
tcgetattr(fd,&oldtio);
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
// set input mode (non-canonical, no echo,...)
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 0; // inter-character timer unused
newtio.c_cc[VMIN] = 10; // blocking read until 10 chars received
res = read(fd,buf,20); // returns after 10 chars have been input
无论我如何更改 g_timeout_add 函数中的间隔参数,都不会发生任何事情。
我阅读了很多关于这个问题的信息,但我找不到任何关于我的问题的解释。此外,我什至找不到处理 UART - GTK 组合的线程。
代码很长,所以我现在只想问你,你是否认为这个想法基本上可行,或者我的概念是否存在根本问题?
仅供参考:我在没有 GUI (->GTK) 的情况下测试了这段代码,它运行良好。在纯 C 中,我可以读取数据并打印它。
我很高兴得到任何答案。
【问题讨论】:
-
read 是一个阻塞函数,主线程/主循环将冻结。您必须使用非阻塞函数或将读取设置为非阻塞或使用 GLib/GIO 异步函数。如果您不从线程更新 UI,也可以使用线程。
-
欢迎来到 Stack Overflow,请拨打tour 和How to create a Minimal, Complete, and Verifiable example。您是否也尝试过编写一个只读取 UART 的小程序?如果小程序也失败了,可能是你没有权限从串口读取。
-
这是可能的,我已经用 Gtk 和 Python 做到了。 Jose Fonte 的回答很好地解释了这一点。