我正在尝试使用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
类似,但它只是表现得很奇怪。字节0x13似乎被多次写入,有时/ dev / ttyACM0被阻止几秒钟,有时它甚至在Vala程序退出后被阻止,有时它根本没有被阻塞。如果我将FileOutputStream写入文件并通过cat byte_file > /dev/ttyACM0
将其发送到串行端口,一切都很好。
在我看来,GIO正在努力解决文件是设备的问题。我的问题是我需要GIO来监控/ dev / ttyACM0,如果它已插入并进行异步读取。
答案 0 :(得分:1)
问题很可能是您必须配置串口以设置波特率,流量控制和奇偶校验等功能。如果你没有得到所有这些选项,很有可能你最终得到你描述的垃圾数据。
基本上,您首先需要文件的整数描述符;获得一个的最简单方法可能是使用Posix.open
打开文件,但您也可以使用GLib.FileStream.fileno
来获取GLib.FileStream
等的整数描述符。接下来,使用{{ 3}}和Posix.cfmakeraw
来配置它。然后,为了获得漂亮的GIO流,只需将整数描述符传递给默认的Posix.cfsetspeed
/ GLib.UnixInputStream
构造函数。
多年前我在Vala写过GLib.UnixOutputStream
。作为一个例子,它有点可怕 - 它是复杂的(我有计划将它用作抽象层),不使用GIO或异步(Vala没有async关键字),使用char []而不是uint8 [ ](我们尚未对uint8 [])进行标准化等,但它应该可以帮助您了解您需要做什么。在这个例子和我上面写的内容之间,你应该能够让它工作,但是如果你在玩完之后仍然遇到麻烦,请告诉我,我可以把一个快速的例子放在一起。