在 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 使用重新编译工具编辑程序集,可能会更容易。
问题
我现在不得不处理一个相当尴尬的 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 使用重新编译工具编辑程序集,可能会更容易。