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

.net core 如何使用.NET内核在Linux上以非规范模式打开tty设备,.net-core,embedded-linux,tty,termios,.net Core,Embedded Linux,Tty,Termios,我在嵌入式Linux平台上使用.NETCore,迄今为止取得了良好的成功。不过,我在尝试以原始(非规范模式)打开tty设备时遇到了一个问题。如果我使用了正则C或C++,我会在打开设备后调用 CFMAKAWAWER()/CUT>,但是我如何从.Net核心应用程序中执行? 我需要使用的设备是用于USB客户端连接器的CDC ACM功能驱动程序,也就是说,它是一个虚拟COM端口。它在我的系统中显示为/dev/ttyGS0。我可以打开设备,然后使用以下代码进行读取和写入: FileStream vcom=

我在嵌入式Linux平台上使用.NETCore,迄今为止取得了良好的成功。不过,我在尝试以原始(非规范模式)打开tty设备时遇到了一个问题。如果我使用了正则C或C++,我会在打开设备后调用<代码> CFMAKAWAWER()/CUT>,但是我如何从.Net核心应用程序中执行? 我需要使用的设备是用于USB客户端连接器的CDC ACM功能驱动程序,也就是说,它是一个虚拟COM端口。它在我的系统中显示为
/dev/ttyGS0
。我可以打开设备,然后使用以下代码进行读取和写入:

FileStream vcom=newfilestream(“/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\u cflag属性(例如波特率、奇偶校验、字符大小)或回显属性(如您所知)

为了进行比较,您提到的libc例程进行了以下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
将终端还原为默认termios配置。

在运行程序之前,请尝试shell命令
stty-F/dev/ttyGS0 raw
。使用
stty-F/dev/ttyGS0 sane
进行还原。谢谢,这成功了!我使用
sty-F>sty-F扩展了它以抑制回音字符/dev/ttyGS0原始-回波