这是我的一部分代码。我会马上解释这个问题。
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);
如果我在前两次尝试访问字节后得到Segmentation fault
,这也很奇怪,因为读取后的变量ret
包含13
,这意味着它已读取13个字节。
我尝试使用g_io_channel_read_line
和g_io_channel_read_to_end
。有了这两个程序,程序就会陷入无限循环(即使我验证了条件G_IO_STATUS_EOF
)。
最后一个问题,也许最烦人的是它第一次不起作用,我需要打开终端的串口,比如cutecom
。否则我可以发送数据,但它不会检测到任何回调。我很确定,因为该设备有二极管来指示状态RX
和TX
。
我不知道出了什么问题,我将非常感谢给我一些提示或链接到合适的例子。我觉得谷歌我找不到更多内容了。谢谢,干杯!
答案 0 :(得分: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
。您还应该首先分配内存,因为它是调用者的责任,而不是函数的。
答案 1 :(得分:1)
当您处理串口时,必须在开始阅读之前正确配置它们。我的猜测是cutecom
正在设置一些重要的串行参数,使端口可用。换句话说,您发布的代码不是问题。丢失的代码是。
检查此问题的好方法是使用stty
。这只是一个示例:使用man stty
来获得(特别长)选项列表。
stty -F /dev/ttyS0 raw 9600 -parity