0

这是我的一段代码。之后我会解释这个问题。

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 字符,这会很奇怪,因为我使用函数将编码设置为 NULLg_io_channel_set_encoding(koncentrator, NULL, NULL);

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

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

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

我不知道出了什么问题,如果能给我一些提示或指向合适示例的链接,我将非常感激。我觉得在谷歌上我找不到更多的东西了。谢谢,干杯!

4

2 回答 2

1

这是根据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。您还应该首先分配内存,因为这是调用者的责任,而不是函数的责任。

于 2013-05-29T01:22:13.397 回答
1

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

检查这一点的一个好方法是使用stty. 这只是一个示例:用于man stty拥有(确实很长)选项列表。

stty -F /dev/ttyS0 raw 9600 -parity
于 2013-05-29T13:30:51.020 回答