我在 WSL 2.0 上使用 Win10 和 Linux Ubuntu。
出于测试某些程序的目的,我想在通过 WSL 运行 Linux 的情况下使用 PC 的串行端口进行“环回”。
基本上,我希望 Linux/WSL 上的进程能够通过串行端口从 Windows 进程发送/接收数据,反之亦然,但无需任何硬件攻击。
当然,我已经尝试将 Windows 进程序列设置为“COM1”(如 Windows 资源管理器所示),将 WSL 上的 Linux 端口设置为“/dev/ttyS1”,但显然它不起作用。
有什么办法可以做到这一点吗?
状态更新
根据其他答案,似乎是产品功能的增加使得通过WSL2使用USB设备成为可能。
特别是在v5.10.93.2中,似乎内置了两种类型的USB串行接口芯片的驱动。
- 启用 CH341 和 CP210X USB 串行驱动程序
- 启用 USB over IP 支持
- 启用 USB 内核配置选项以通过 USB 与 Arduino 进行交互
以下信息已过时。
WSL 2.0 不支持串口。
- WSL 2 不支持访问串行端口。要了解更多信息,请参阅常见问题解答或有关串行支持的 WSL GitHub 存储库问题。
可以选择以下选项。
恢复到 WSL 1.0 并使用
使用第三方产品
另外,即使WSL2无法识别USB串口,如果你想在串口之间进行通信,也可以使用此方法。
通过网络连接串口(com 口)
从上面的解释可以看出,如果你想在各个操作系统的进程之间进行通信,你可以简单地使用 TCP/IP 套接字来代替上述机制。
在 PowerShell 或 CMD 中运行此命令以查看您是否使用版本 1:
C:\>wsl -l -v
NAME STATE VERSION
* Ubuntu Running 1
如果是,这里有一些经过测试的工作代码,用于从 Linux 命令提示符读取 COM14:
#!perl -w
use strict;
$|=1; # autoflush
use Device::SerialPort;
my $port = Device::SerialPort->new("/dev/ttyS14");
$port->baudrate(115200); # Configure below to match your device
$port->databits(8);
$port->parity("none");
$port->stopbits(0);
$port->debug(1);
$port->read_char_time(0); # don't wait for each character
$port->read_const_time(1); # 0.001 second per unfulfilled "read" call
while (1) {
my ($count_in, $str_in) = $port->read(255); # Supposedly must be 255 always
if($count_in) {
print $str_in;
}
}
如果您正在运行 WSL2,您可以通过
wsl --export
、wsl --import
和 wsl --set-version
将您的发行版备份、转换或复制到 WSL1。有关详细信息,请参阅此问题等。