答案1
COM1
WSL 上的串行端口从 Windows 端(通过)映射COM4
到 Linux 端/dev/ttyS1
。/dev/ttyS4
看起来您COM4
在 Python 中使用了该名称。使用与 Windows 端口号匹配的 Linux 设备名称。
`COM1:` - `/dev/ttyS1`
`COM2:` - `/dev/ttyS2`
`COM3:` - `/dev/ttyS3`
ETC。
答案2
花了大约 2 个小时寻找如何做到这一点。这就是我的做法。简而言之,请按照以下步骤操作:https://learn.microsoft.com/en-us/windows/wsl/connect-usb
我的配置:Windows 10/WSL2 步骤:
- 以管理员身份打开 Powershell
- 安装 usbip(按照链接说明)
usbipd list
- 绑定 USB 以进行共享
usbipd bind --busid 2-7
(对我来说是 2-7) - 验证
usbip list
其共享 - 附加到 wsl
usbipd attach --wsl --busid 2-7
答案3
在 Windows Subsystem for Linux 下访问物理硬件很棘手。您没有提到您正在运行的是 WSL1 还是 WSL2(实际上您根本没有提到 WSL,但从屏幕截图中可以明显看出,感谢 @popey 发现这一点并将其编辑到问题标签中)。
在 WSL2 下,您绝对无法直接访问 Ubuntu 内的串行端口。请记住,Ubuntu 在托管虚拟机内的命名空间容器(类似于 Docker 和其他容器技术)内运行。“托管”意味着 WSL 本身处理虚拟机的配置,因此用户对它的控制并不多。
对于 USB,你有一个解决方法,即USB/IP,但据我所知,除非您连接了 USB<->RS232 串行适配器,否则这不适用于非 USB 串行端口。即使这样,您可能仍需要在内核中构建对它的支持。
在 WSL1 下,情况可能会更好,但这取决于你需要的功能。WSL1 有效直接地在 Windows 上通过“syscall<->WinAPI 转换层”,这意味着它做直接访问一些硬件。不过,这种访问仅限于 Windows 团队已实现的系统调用。在许多情况下,这不包括配置接口的调用。
如果您使用的是 WSL2(默认),那么我建议:
初见此主题提到使用 CommTunnel(在 Windows 中)和 socat(在 Linux 中)来隧道传输串行端口流量。这并不容易,而且我也无法提供帮助 - 如果您需要这方面的帮助,也许可以去专门的 RoS 论坛咨询。
或者,您可以尝试将 Ubuntu 发行版转换为 WSL1。 您可以使用以下命令从 PowerShell 执行此操作:
wsl -l -v
# Confirm the <distro_name>
wsl --set-version <distro-name> 1
如果这不起作用,您可能需要使用虚拟机而不是 WSL。
答案4
我自己在使用 WSL2 和 Ubuntu 时也遇到了这个问题,但我相信我找到了解决方法。
我编码和使用 VSC 的方式是打开 WSL,CD 到我想要的文件夹,然后在控制台中输入“code”。Windows 打开 VSC 并将其连接到 WSL,然后我使用内置的 bash 终端进行 NPM 等操作。这比使用 Windows 安装常见的开发工具要容易得多。
对于我正在从事的项目,我需要访问串行数据,因为我正在使用 UART,并且串行监视器提供了 /dev/ttyS3,理论上它应该可以工作,但正如有人指出的那样,WSL2 无法直接访问硬件。但事实并非如此。
什么有效?我显示了项目路径(shift+alt+r),打开了一个 Explorter 窗口。我的路径是:
\\wsl.localhost\Ubuntu\root\dev\uart
我打开了一个新的 VSC 窗口,然后手动打开路径。通常当我这样做时,我会被困在 PowerShell 终端上,但令我惊讶的是,它已经连接到 WSL 并且我有 bash。但是,串行监视器现在显示了 COM 端口,当我使用 ESP-Link 时,我能够读取数据。
成功!