serial-port - FileOutputStream:写入串口

标签 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 但它的行为很奇怪。 Byte 0x13 似乎被多次写入,有时/dev/ttyACM0 被阻塞几秒钟,有时甚至在 Vala 程序退出后被阻塞,有时根本不被阻塞。如果我将 FileOutputStream 写入文件并通过 cat byte_file >/dev/ttyACM0 将其发送到串行端口,一切都很好。

在我看来,GIO 正在努力解决文件是设备这一事实。我的问题是我需要 GIO 来监视/dev/ttyACM0(如果已插入)并进行异步读取。

最佳答案

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

基本上,您首先需要文件的整数描述符;最简单的获取方法可能是使用 Posix.open 打开文件,但您也可以使用 GLib.FileStream.fileno获取 GLib.FileStream 的整数描述符等等。接下来,使用Posix.cfmakerawPosix.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/

相关文章:

C#串口,模拟串口写入

c - g_source_set_callback : invalid callback data pointer

java - 创建文本文件,tar 文件并将其放入输入流中?

python - Windows 到 Raspberry Pi 零串行问题

python - 如何将变量从 NodeJs 插入到 python 脚本中?

c++ - 使用 CMake 构建 GStreamer 会导致 SDP 和 WebRTC 无法解析的外部符号错误

java - 将字节数组写入java中的子文件夹

c++ - 在 C++ 中使用 RWCString 读取文本文件时获取 RWBoundsErr

c++ - 打开 COM 端口时调试断言失败

c - 如何覆盖GstBin中的handle_message?