GIOChannel有时它有时读不

时间:2013-05-28 19:43:31

标签: c linux serial-port glib uart

这是我的一部分代码。我会马上解释这个问题。

GIOStatus ret;
GError *err = NULL;
gchar *msg;
gsize *len;
ret = g_io_channel_read_chars (koncentrator, &msg, 13, &len, err);
printf ("Read %u bytes: %hx\n", len, msg);

我的设备通过串口发送13个字节的链。不幸的是,只能正确读取前两个字节。也许这是因为只有前两个字节可以解释为ASCII字符,这很奇怪,因为我使用函数g_io_channel_set_encoding(koncentrator, NULL, NULL);

将编码设置为NULL

如果我在前两次尝试访问字节后得到Segmentation fault,这也很奇怪,因为读取后的变量ret包含13,这意味着它已读取13个字节。

我尝试使用g_io_channel_read_lineg_io_channel_read_to_end。有了这两个程序,程序就会陷入无限循环(即使我验证了条件G_IO_STATUS_EOF)。

最后一个问题,也许最烦人的是它第一次不起作用,我需要打开终端的串口,比如cutecom。否则我可以发送数据,但它不会检测到任何回调。我很确定,因为该设备有二极管来指示状态RXTX

我不知道出了什么问题,我将非常感谢给我一些提示或链接到合适的例子。我觉得谷歌我找不到更多内容了。谢谢,干杯!

2 个答案:

答案 0 :(得分:1)

根据documentation

,这是g_io_channel_read_chars的签名
GIOStatus           g_io_channel_read_chars             (GIOChannel *channel,
                                                         gchar *buf,
                                                         gsize count,
                                                         gsize *bytes_read,
                                                         GError **error);

您正在传递&msg作为参数buf,因此您传递的值为gchar**,其中函数需要gchar*。您应该通过msg。您还应该首先分配内存,因为它是调用者的责任,而不是函数的。

答案 1 :(得分:1)

当您处理串口时,必须在开始阅读之前正确配置它们。我的猜测是cutecom正在设置一些重要的串行参数,使端口可用。换句话说,您发布的代码不是问题。丢失的代码是。

检查此问题的好方法是使用stty。这只是一个示例:使用man stty来获得(特别长)选项列表。

stty -F /dev/ttyS0 raw 9600 -parity