如何使用 .NET Core 在 Linux 上以非规范模式打开 tty 设备



到目前为止,我在嵌入式Linux平台上使用.NET Core取得了很好的成功。不过,我只是在尝试以原始(非规范模式(打开 tty 设备时遇到了问题。如果我使用的是常规 C 或 C++我会在打开设备后调用cfmakeraw(),但如何从 .NET Core 应用执行此操作?

我需要使用的设备是 USB 客户端连接器的 CDC ACM 函数驱动程序,即它是一个虚拟 COM 端口。它在我的系统中显示为/dev/ttyGS0.我可以打开设备,然后使用以下代码从中读取和写入它:

FileStream vcom = new FileStream("/dev/ttyGS0", FileMode.Open);

由于 tty 设备默认以规范模式打开,因此在用户在文本行末尾发送回车符之前,我不会收到任何字符。我需要在发送时接收每个字符,而不是等到发送回车符,即我需要对 tty 设备使用原始模式。

下面的代码不起作用,因为 .NET Core 没有意识到此设备是虚拟串行端口,因此当我尝试以这种方式打开它时它会引发异常。当我使用SerialPort打开真正的UART设备时,它们确实按预期在原始模式下运行。

SerialPort serialPort = new SerialPort("/dev/ttyGS0);

由于您有一个终端设备,您可以在实际使用它之前尝试更改其termios配置。
尝试在运行程序之前发出 shell 命令stty -F /dev/ttyGS0 raw

raw设置将对非规范模式进行以下术语更改(根据stty手册页(:

-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixany -ixoff -imaxbel 
-opost 
-icanon -isig -xcase -iuclc  
min 1 time 0

请注意,raw设置不会更改c_cflag属性(例如波特率、奇偶校验、字符大小(或回显属性(如您所知(。

为了进行比较,您提到的libc cfmakeraw((例程进行了以下termios设置:

t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
t->c_oflag &= ~OPOST;
t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
t->c_cflag &= ~(CSIZE|PARENB);
t->c_cflag |= CS8;
t->c_cc[VMIN] = 1;      /* read returns when one char is available.  */
t->c_cc[VTIME] = 0;

您可以使用stty -F /dev/ttyGS0 sane将终端恢复为默认终端配置。

相关内容

  • 没有找到相关文章

最新更新