2

我正在尝试使用 FileOutputStream 将单个字节写入 Vala 中的串行端口:

var dev = File.new_for_path("/dev/ttyACM0");
var dev_io = dev.open_readwrite();
var dev_o = dev_io.output_stream as FileOutputStream;
dev_o.write({0x13});
dev_o.flush();

我的目标是这样做类似于echo -en '\x13' > /dev/ttyACM0但它的行为很奇怪。Byte 0x13 好像被多次写入,有时 /dev/ttyACM0 被阻塞了几秒钟,有时甚至在 Vala 程序退出后被阻塞,有时根本没有被阻塞。如果我将 FileOutputStream 写入文件并通过一切将其发送到串行端口,cat byte_file > /dev/ttyACM0一切都很好。

在我看来,GIO 似乎在为文件是一个设备这一事实而苦苦挣扎。我的问题是我需要 GIO 来监控 /dev/ttyACM0 是否已插入并进行异步读取。

4

1 回答 1

2

问题很可能是您必须配置串行端口来设置波特率、流量控制和奇偶校验等内容。如果您没有正确选择所有这些选项,则很有可能最终会得到您所描述的垃圾数据。

基本上,您首先需要文件的整数描述符;最简单的获取方法可能是使用 打开文件Posix.open,但您也可以使用GLib.FileStream.fileno来获取 a 的整数描述符GLib.FileStream等。接下来,使用Posix.cfmakerawPosix.cfsetspeed配置它。然后,要获得漂亮的 GIO 流,只需将整数描述符传递给默认GLib.UnixInputStream/GLib.UnixOutputStream构造函数。

多年前,我在 Vala 写了一个类来处理串行通信。作为一个例子,它有点可怕——它很复杂(我计划将它用作抽象层),不使用 GIO 或 async(Vala 没有 async 关键字),使用 char[] 而不是 uint8[ ](我们尚未对 uint8[] 进行标准化)等,但它应该可以帮助您了解您需要做什么。在那个例子和我上面写的之间,你应该能够让它工作,但如果你在玩过它后仍然遇到问题,请告诉我,我可以整理一个简单的例子。

于 2013-12-31T02:00:47.837 回答