对于上下文:我正在用 Rust 编写光线追踪器,但我正在努力寻找一种以与文件系统无关的方式加载场景的好方法。我正在使用serde,这样我就不必发明自己的文件格式(还)。资源(图像纹理和网格数据)单独存储到场景文件中。场景文件只存储这些文件的路径。因为光线追踪器本身应该是一个与平台无关的库(我希望能够将其编译为浏览器的 WebAssembly),所以光线追踪器本身不了解文件系统。我打算在反序列化场景时加载资产,但这现在给我带来了真正的问题:
我需要将文件系统接口代码的实现传递给我可以使用的 serde Deserialize::deserialize(),但似乎没有任何简单的方法可以做到这一点。我想出了一种使用泛型来实现这一点的方法,但我对此并不满意。
这是我目前正在做的方式,作为 MCVE 进行剥离(使用的包是serde和serde_json):
库代码(lib.rs):
use std::marker::PhantomData;
use serde::{Serialize, Serializer, Deserialize, Deserializer};
pub struct Image {}
pub struct Texture<L: AssetLoader> {
path: String,
image: Image,
phantom: PhantomData<L>,
}
impl<L: AssetLoader> Serialize for Texture<L> {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.path.serialize(serializer)
}
}
impl<'de, L: AssetLoader> Deserialize<'de> for Texture<L> {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Texture<L>, D::Error> {
let path = String::deserialize(deserializer)?;
// This …Run Code Online (Sandbox Code Playgroud) 这是一个更新和缩短的问题。
通过PyUSB与 USB 设备通信应该很容易。因此,我尝试在 Win10 下使用 PyUSB 从 USB 设备(示波器)读取数据。显然,自从找到设备以来,USB 驱动程序 (libusb-win32 v1.2.6.0) 已正确安装,并且我得到了一些响应print(dev)(见下文)。由此我可以看到输出端点地址是0x3,输入端点地址是0x81
根据示波器手册,我应该发送:SDSLSCPI#到设备以将其设置为 SCPI 模式,并且应该得到响应“:SCPION”。然而,当:SDSLSCPI#可再现地发送示波器的监视器时,它会冻结并且会重新启动。
如果我发送,*IDN?我应该得到回复,P1337,1842237,V2.4.0->。但前提是设备已处于 SCPI 模式。显然,事实并非如此,我收到超时错误(见下文)。
那么,我在这里做错了什么?我在PyUSB 教程中缺少哪些信息。我是否使用了错误的 PyUSB 命令/参数,或者是否缺少额外的驱动程序,或者是否与硬件(Win10 或设备硬件)有关?感谢您提供有关如何找出问题所在的提示。
顺便问一下, 中的第二个值是多少dev.read(0x81,7)?要读取的字节数?嗯,通常我不知道设备将发送多少字节。我期望在超时时间内读取一个命令,直到出现换行符或其他终止符。在哪里可以找到有关 PyUSB 的“万无一失”的文档、教程和示例?
代码:
import usb.core
import usb.util
dev = usb.core.find(idVendor=0x5345, idProduct=0x1234)
if dev is None:
raise ValueError('Device is not found')
# device is found :-)
print(dev)
dev.set_configuration()
msg = ':SDSLSCPI#'
print("Write:", msg, dev.write(3,msg)) …Run Code Online (Sandbox Code Playgroud)