2013-05-28 20 views
0

这是我的一段代码。我会在之后解释问题。GIOChannel有时它读取有时不是

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字符,这将是奇怪的,因为我设置编码与功能NULL g_io_channel_set_encoding(koncentrator, NULL, NULL);

如果我尝试访问前两后的字节,我得到Segmentation fault,这是也很奇怪,因为读取后变量ret包含13这意味着它已经读取了13个字节。我试过用g_io_channel_read_lineg_io_channel_read_to_end。有了这两个程序在无限循环(甚至当我验证条件G_IO_STATUS_EOF)。

最后一个问题,也许最烦人的是它不能在第一时间工作,我需要打开终端的串口,例如cutecom。否则,我可以发送数据,但它不检测任何回调。我相信这是因为该设备具有二极管以指示RXTX的状态。

我不知道什么是错,我会非常好的给我一些提示或链接到合适的例子。我觉得没有什么比谷歌我可以找到更多。谢谢,欢呼!

回答

1

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

检查此问题的好方法是使用stty。这仅仅是一个例子:使用man stty来拥有(无限长)选项列表。

stty -F /dev/ttyS0 raw 9600 -parity 
+0

非常感谢。这工作。我也想问一下如何制作它,我应该将它添加到引导rc脚本中,以便在每次引导后执行此操作? – Marek

+0

@Marek可以,例如你可以使用'/ etc/rc.local'。更好的方法是在你的程序开始时通过'g_spawn_command_line_sync()'产生'stty'调用。最好的解决方案是直接调用'termios' API来获得相同的配置,但这需要更多的工作。 – fetasail

1

这是g_io_channel_read_chars按照该documentation签名:你是路过&msg作为参数buf

GIOStatus   g_io_channel_read_chars    (GIOChannel *channel, 
                 gchar *buf, 
                 gsize count, 
                 gsize *bytes_read, 
                 GError **error); 

,因此要传递gchar**类型,其中函数需要gchar*的值。您应该改为msg。你还应该首先分配内存,因为它是调用者的责任,而不是函数的内存。

+0

谢谢阿德里安。我添加了'malloc',并将'&msg'改为'msg',这解决了'Segmentation fault'问题。 但我仍然遇到通讯问题,我需要用'cutecom'终端打开设备,然后我的C程序才能够接收来自设备的消息。 我忘了说我将模块添加到内核中,所以我确定该设备存在于系统中,它由'cutecom'终端添加。 – Marek

相关问题