Serial port FileOutputStream:写入串行端口

Serial port FileOutputStream:写入串行端口,serial-port,glib,fileoutputstream,vala,gio,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的事

我正在尝试使用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正在与文件是一个设备这一事实作斗争。我的问题是,如果插入/dev/ttyACM0并进行异步读取,我需要GIO监视它。

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

基本上,首先需要文件的整数描述符;获取整型描述符的最简单方法可能是使用打开文件,但也可以使用获取整型描述符,等等。接下来,使用和对其进行配置。然后,要获得漂亮的GIO流,只需将整数描述符传递给默认/构造函数

很多年前我在瓦拉写作。举个例子,它有点可怕,它很复杂(我计划将其用作抽象层),不使用GIO或async(Vala没有async关键字),使用char[]而不是uint8[](我们还没有在uint8[]上标准化),等等,但它应该可以帮助您理解需要做什么。在这个例子和我上面写的东西之间,你应该能够让它工作起来,但是如果你玩过之后仍然有问题,请告诉我,我可以提供一个快速的例子