我正在尝试使用 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(如果已插入)并进行异步读取。
最佳答案
问题很可能是您必须配置串行端口来设置波特率、流量控制和奇偶校验等内容。如果您没有正确选择所有这些选项,那么您很可能会得到您所描述的垃圾数据。
基本上,您首先需要文件的整数描述符;最简单的获取方法可能是使用 Posix.open
打开文件,但您也可以使用 GLib.FileStream.fileno
获取 GLib.FileStream
的整数描述符等等。接下来,使用Posix.cfmakeraw
和 Posix.cfsetspeed
来配置它。然后,要获得漂亮的 GIO 流,只需将整数描述符传递给默认值 GLib.UnixInputStream
即可。/GLib.UnixOutputStream
构造函数。
我写了a class to handle serial communication许多年前在瓦拉。作为一个例子,它有点可怕——它很复杂(我计划将它用作抽象层),不使用 GIO 或 async(Vala 没有 async 关键字),使用 char[] 而不是 uint8[ ] (我们还没有对 uint8[] 进行标准化)等,但它应该可以帮助您理解您需要做什么。在这个例子和我上面写的内容之间,你应该能够让它工作,但是如果你在使用它后仍然遇到问题,请告诉我,我可以拼凑一个简单的例子。
关于serial-port - FileOutputStream:写入串口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20844671/