看起来已经很久没有使用过Windows了,但是这个概念仍然适用。首先,这个USB调制解调器似乎具有模式切换功能,这意味着它首先将自己标识为CD-ROM,以便您获取驱动程序,然后在安装完成后切换到包含创建3个COM端口符号链接的脚本的大容量存储设备。
要在应用程序中使用它,您需要几件事情,首先是USB PID和VID,以便能够在计算机集线器上枚举设备。其次,您需要该触发符号链接创建的脚本的副本,并且需要在检测到设备(通过枚举VID和PID)后从应用程序中调用该脚本。一旦脚本执行,三个COM端口将自动出现,您应该能够像平常一样访问它们。此外,您可能还需要检查CD-ROM应用程序是否安装了DLL(几乎肯定会这样做,而且第二个脚本在创建COM端口链接之前几乎肯定会检查DLL),因此请确保DLL保持在它们应该在的位置。您还需要将它们与您的应用程序链接起来,以获得它们提供的任何额外功能(但这会打开原生接口的潘多拉魔盒,如果您不熟悉,请不要这样做...我可以在Java中执行/显示示例,但不是C#)。否则,如果只是想使用COM端口,并且您实际上知道如何与设备通信(AT命令),那么请忘记它并打开COM端口并开始操作。最后一点,您将不得不找出C#的本机接口(实际上不是本机接口,只是一个系统调用函数,用于执行bash命令以运行脚本/exe,仅此而已),因此请查找内置在.NET框架中的系统调用函数。
如果您需要进一步的步骤说明,请告诉我。
更新:
对于USB枚举,您可以使用类似于Java的usb4java库,并实现类似于以下函数的功能。
public Device findDevice(short vendorId, short productId)
{
DeviceList list = new DeviceList();
int result = LibUsb.getDeviceList(null, list);
if (result < 0) throw new LibUsbException("Unable to get device list", result);
try
{
for (Device device: list)
{
DeviceDescriptor descriptor = new DeviceDescriptor();
result = LibUsb.getDeviceDescriptor(device, descriptor);
if (result != LibUsb.SUCCESS) throw new LibUsbException("Unable to read device descriptor", result);
if (descriptor.idVendor() == vendorId && descriptor.idProduct() == productId)
return device;
}
}
finally
{
LibUsb.freeDeviceList(list, true);
}
return null;
}
这个函数允许你直接从应用程序访问USB设备。然后,你可以开始初始化序列和批量传输(很可能适用于虚拟串口设备,例如FTDI芯片,但由于这是一个未知的中国芯片,这就是我们在低级别上所能做的,我们必须在提供的基础上构建,并让Windows完成驱动程序的工作)...
此时,你的程序确定USB设备已插入,如果函数返回null,则休眠一秒钟并继续轮询,直到设备插入。
从这一点开始,你需要运行将创建符号链接的脚本,我假设它是一个.exe文件。以下是另一位成员发布的C#代码的复制和粘贴:
using System.Diagnostics;
ProcessStartInfo start = new ProcessStartInfo();
start.Arguments = arguments;
start.FileName = "C:/path/to/your/.exe";
start.WindowStyle = ProcessWindowStyle.Hidden;
start.CreateNoWindow = true;
int exitCode;
using (Process proc = Process.Start(start))
拥有退出代码非常有用,可以指示脚本是否成功创建了符号链接(希望这位中文开发者遵循了适当的编码实践)。
编辑:
脚本可能会失败。原因很简单:它不知道要枚举和执行初始化的ProductID和VendorID。(99.99999%他们没有为每个单元重新编译简单的初始化脚本以硬编码pid和vid),所以它可能会将pid和vid作为参数接收(最好的情况),或从USB存储隐藏扇区读取(此时如果您从非根位置运行脚本,可能会出现路径问题)...您可能需要使用gdb找出某些参数是否缺失,特别是如果.exe未向stderr输出任何内容。
最后,在此时您可以开始使用类似以下方式的标准C#库查找COM端口列表:
代码来源
var portNames = SerialPort.GetPortNames();
foreach(var port in portNames) {
}
当您找到所需的端口时,可以使用以下代码打开它:
Code Source。请注意保留HTML标记。
public static void Main()
{
string name;
string message;
StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
Thread readThread = new Thread(Read);
_serialPort = new SerialPort();
_serialPort.PortName = SetPortName(_serialPort.PortName);
_serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate);
_serialPort.Parity = SetPortParity(_serialPort.Parity);
_serialPort.DataBits = SetPortDataBits(_serialPort.DataBits);
_serialPort.StopBits = SetPortStopBits(_serialPort.StopBits);
_serialPort.Handshake = SetPortHandshake(_serialPort.Handshake);
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
_serialPort.Open();
_continue = true;
readThread.Start();
Console.Write("Name: ");
name = Console.ReadLine();
Console.WriteLine("Type QUIT to exit");
while (_continue)
{
message = Console.ReadLine();
if (stringComparer.Equals("quit", message))
{
_continue = false;
}
else
{
_serialPort.WriteLine(
String.Format("<{0}>: {1}", name, message));
}
}
readThread.Join();
_serialPort.Close();
}
public static void Read()
{
while (_continue)
{
try
{
string message = _serialPort.ReadLine();
Console.WriteLine(message);
}
catch (TimeoutException) { }
}
}
希望这能帮助你入门!