到目前为止,我在嵌入式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
将终端恢复为默认终端配置。