在 Ubuntu 中从 ttyUSB 端口创建 COM 端口

Creating a COM port out of a ttyUSB port in Ubuntu

问题

我现在不得不处理一个相当尴尬的 API,坚持 给我一个设备的地址,通过 USB 端口链接,在形式 COM*。然而,在我工作的 Ubuntu 机器上,并且必须使用,如果我插入这个设备,它将自动分配一个地址,格式为 /dev/ttyUSB*.

考虑到我无法修改 API 的源代码 - 我非常想这样做! - 让 API 与所述设备对话的最不痛苦的方法是什么?

额外的细节

如何使用手册中的 API 的示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using com.caen.RFIDLibrary;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      CAENRFIDReader MyReader = new CAENRFIDReader();
      MyReader.Connect(CAENRFIDPort.CAENRFID_RS232, "COM3");
      CAENRFIDLogicalSource MySource = MyReader.GetSource("Source_0");
      CAENRFIDTag[] MyTags = MySource.InventoryTag();

      if (MyTags.Length > 0)
      {
        for (int i = 0; i < MyTags.Length; i++)
        {
          String s = BitConverter.ToString(MyTags[i].GetId());
          Console.WriteLine(s);
        }
      }
      Console.WriteLine("Press a key to end the program.");
      Console.ReadKey();
      MyReader.Disconnect();
    }
  }
}

MyReader.Connect(CAENRFIDPort.CAENRFID_RS232, "COM3"); 行是我 运行 遇到问题的地方。

稍后在手册中指出Connect方法有两个参数:

ConType: The communication link to use for the connection.

Address: Depending on ConType parameter: IP address for TCP/IP communications ("xxx.xxx.xxx.xxx"), COM port for RS232 communications ("COMx"), an index for USB communications (not yet supported).

奖金问题

有问题的 API 似乎是在 Windows 机器上 运行 的假设下编写的。 (它在 C# 中。)Windows 体系结构似乎更喜欢 COM* 格式——我很高兴在这一点上得到纠正,而 Ubuntu 似乎更喜欢 ttyUSB* 格式。假设我可以将设备中的数据从 ttyUSB* 端口汇集到 COM* 端口,API 是否真的能够找到所述数据?还是会错误地遵循默认的 Windows 路径?

鉴于新信息,我怀疑您可以将 ttyUSB 作为参数,mono 将正确处理连接。然而,对于下面的行尾,同样的警告仍然适用。您还可以考虑使该参数成为命令行参数,从而通过命令行参数提供 COM/USB,从而使您的代码在任何平台上都可以 运行。我没有看到使用此代码的其他问题。你试过了吗?

PS:我认为你的困惑实际上是不支持 usb id 的声明,我怀疑这是因为库依赖于(基于文本的)串行连接,这与直接 USB 根本不同以更直接的方式处理连接的连接(通常由驱动程序处理)。 linux 上的 ttyUSB 端口代表(UART)串行连接与 windows COM 端口相同,这些不是直接的 USB 连接。

一些关于差异的有用信息:https://rfc1149.net/blog/2013/03/05/what-is-the-difference-between-devttyusbx-and-devttyacmx/

旧答案

我假设你 运行 这个程序在 Mono 上?

Mono 需要端口路径,因此 COM* 不会。您可以尝试创建一个名为 COM* 的符号链接到 ttyUSB*。最好位于环境目录中。一旦你把它们链接起来,程序应该看不出有什么区别。但是 data/program 中的行结尾可能与 windows 中的行结尾不同。如果设备需要 CRLF 而程序使用 Environment.NewLine,您也可能会遇到意外行为。如果您有 permission/rights 使用重新编译工具编辑程序集,可能会更容易。