FileOutputStream:写入串口

时间:2013-12-30 17:46:56

标签: serial-port glib fileoutputstream vala gio

我正在尝试使用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,如果它已插入并进行异步读取。

1 个答案:

答案 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 [])进行标准化等,但它应该可以帮助您了解您需要做什么。在这个例子和我上面写的内容之间,你应该能够让它工作,但是如果你在玩完之后仍然遇到麻烦,请告诉我,我可以把一个快速的例子放在一起。