FileOutputStream:写入串口

Posted

技术标签:

【中文标题】FileOutputStream:写入串口【英文标题】:FileOutputStream: write to serial port 【发布时间】:2014-01-17 15:23:50 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于FileOutputStream:写入串口的主要内容,如果未能解决你的问题,请参考以下文章

review26

BigDataJava基础_FileOutputStream写入文件

JDK源码:FileOutputStream

Java IO流 之 FileOutputStream 写入文件

字节输出流_OutputStream类&FileOutputStream类介绍和字节输出流写入数据到文件

FileOutputStream