问题标签 [virtual-serial-port]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2245 浏览

c# - 为32feet下的widcomm stack创建虚拟串口

目前我正在做一个项目,涉及 PDA 和小型嵌入式设备之间的蓝牙通信设置。这种小型嵌入式设备只能通过蓝牙链路与虚拟串行端口通信。

PDA 是运行 windows mobile 6 的 ipaq,我使用的是 c#。

我做了一个可以通过蓝牙与串口通信的程序。但唯一的问题是每次我运行这个程序时,我都必须激活蓝牙收音机,并通过蓝牙管理器手动将此设备与 pda 配对。我要做的是在运行这个程序时,它可以在 pda 和嵌入式模块之间建立蓝牙连接。

所以我正在使用 32feet 项目中的函数。这是一个问题,我无法制作虚拟串口部分,因为我认为 32feet 项目只能为窗口蓝牙堆栈制作虚拟串口,但不能为 ipaq 使用的 widcomm 蓝牙 stact 制作虚拟串口。

因此,是否有任何现有的c#类或堆栈可以在widcomm for windows mobile 6下制作虚拟串口。

谢谢

0 投票
2 回答
11949 浏览

linux - Linux下为FTDI虚拟串口指定非标准波特率

我有一个 USB 设备,我试图通过 ftdi_sio 内核模块提供的虚拟串行端口与之通信。但是,我在将端口的波特率设置为 14400 时遇到了一些问题:

  • termios.h没有为 14400 指定常量,所以我不能使用cfsetispeedand cfsetospeed
  • 在 ftdi_sio 内核模块的源代码中,波特基设置为 24000000,似乎没有办法改变它。这意味着我不能对TIOCSSERIALioctl 使用自定义除数并以这种方式获得 14400 波特率。
  • 模块源有一条评论,听起来好像将端口结构的alt_speed成员设置tty_struct为 14400 会做我想做的事,但鉴于现有接口,似乎没有任何方法可以将其设置为 14400。

有人对此有任何想法吗?通过破解内核模块很容易解决这个问题,但我真的在寻找一种不需要内核更改的解决方案。

0 投票
2 回答
2406 浏览

java - RXTX虚拟串口读取问题

背景:Windows Server 2003 R2,使用RealPort软件创建的Wire Service虚拟串口,串口配置为COM5,9600波特,8个数据位,无奇偶校验位,1个停止位,无流控,使用RXTX 2.1-7。

找到端口 COM5,使用 portId.open 方法创建串行端口,并设置端口参数和流控制以匹配上面的设备驱动程序设置。我得到了 serialPort IntupStream 并将其包装在 InputStreamReader 中,这样我就可以控制输入编码。默认编码当然是 Cp1252 我读过,如果您使用 8 个数据位,则编码应该是 ISO-8859-1 aka Latin1。并且正在使用 InputStreamReader 方法: int c = isr.read(); 在 while 循环中 SerialPort.Event.DATA_AVAILABLE 打印出整数 c 并将其转换为字符 ((char)c); 问题是数字和生成的字符移动得太高(范围是 135 - 250) 消息都以“保留所有权利。)”结尾,并且每条消息中的最后一个字符都是相同的。然而,从一个角色到另一个角色的转变并不一致。尝试过其他编码:UTF8/UTF-8 将数字移得更高。ascii/us-ascii 也是如此。Cp1252 将数字移至 130 - 350 范围,但 3 个字符移至 65533、8222 和 8240。注意:使用 InputStreamReader.getEncoding() 时,UTF8 和 UTF-8 是 UTF8,ascii 和 us-ascii 是 ASCII。

我应该尝试其他编码吗?还有人见过这种东西吗?

0 投票
2 回答
1525 浏览

windows-mobile - 在启动时加载设备驱动程序时出现问题 - WM6.1

我们的嵌入式系统程序员为我们的移动硬件开发了一个虚拟串行端口驱动程序的外壳,我一直在填写使其工作的方法。该驱动程序确实按预期工作,它模拟了一个用于喷出 NMEA 字符串(GPS 数据)的 USB 设备的 COM 端口。

我简称 WM6,但操作系统是 WM6.1,如果它有什么不同的话。

我遇到的问题是驱动程序仅在 WM6 上启动设备时不加载。该驱动程序是为 CE5 和 WM6 开发的,但在 CE5 上,驱动程序“确实”在启动时加载,这将我指向 WM6 配置问题。在这一点上可能值得注意的是,驱动程序将使用 ActivateDevice() 方法加载到 WM6 和 CE5 中,这是我迄今为止一直在使用的 WM6,一个用于启动驱动程序的小型测试应用程序,因此我至少可以测试驱动程序正在开发 WM6。

注册表中已经填充了启动驱动程序所需的密钥。所以驱动程序应该在启动时加载,没有任何问题。HKEY_LOCAL_MACHINE\Drivers\BuiltIn 包含一个子键 A36D_GPS_COM,并且包含在该键中。

设备数组索引:0

设备类型:0

DLL:A36D.dll

标志:0

友好名称:A36D GPS COM 端口

指数:8

订购:3

前缀:COM

优先级:0

优先级:256

据我所知,我已经调查过这个问题通常有两个常见的答案。这些想法是嵌入式程序员给我的,但我自己研究了如何去做。

1) 当驱动程序尝试加载时,COM 端口已经在使用中,即使在加载设备后该 COM 端口最终是空闲的。我已将注册表中的 Index 值从 1 更改为 20 并重新启动设备,驱动程序未加载到指定的 COM 端口。因此,为了更彻底地尝试和测试,我将另一个设备从 COM9 移到了 COM8,并将我的驱动程序移到了 COM9(使用上述注册表设置)。其他设备驱动程序在 COM8 上启动时非常愉快地加载,但我的设备驱动程序无法在 COM9 上启动。我什至尝试过调整其他设置,但它仍然没有在启动时加载。

2)CE5和WM6之间另一个可能的问题和区别是安全性。所以使用 MSDN 文章http://msdn.microsoft.com/en-us/library/bb737570.aspx我从事过签名和 XML 配置方面的工作。使用特权密钥(未过期),在 Visual Studio 中对 A36D.dll 进行签名,并且创建的安装 CAB 文件也使用相同的密钥进行签名。创建一个 _setup.xml 文件并将其附加到 cab 文件,以便将签名密钥添加到证书存储区。CAB 文件使用相同的密钥再次签名,以确保它仍然有效。此外,_setup.xml 被打包到它自己的 .CPF 文件中。CAB 和 CPF 文件都将密钥添加到证书存储“HKEY_LOCAL_MACHINE\Comm\Security\SystemCertificates”,所以知道这是有效的。为谨慎起见,我已将其安装到 Privileged、Unprivileged、ROOT 和 SPC 证书存储区。但是当移动设备启动时,设备驱动程序仍然没有加载到 device.exe 中。

除了在驱动程序上调用 ActivateDevice() 的启动应用程序的解决方法之外,我对如何让该驱动程序在启动时加载感到困惑。

我觉得它在 CE5 中有效但在 WM6 中无效,这很奇怪,我只是不知道其他任何可能导致问题的东西。

有没有人有任何进一步的建议可以尝试。

所有帮助表示赞赏。

0 投票
6 回答
5046 浏览

delphi - 使用软件/虚拟 COM 端口和另一端的控制台/终端调试 COM 端口读/写

我有一个 Delphi 应用程序,可以读取/写入连接到大型硬件设备的 COM 端口,因此在开发过程中我通常没有可用的硬件。也就是说,通信协议相当简单,所以我一般可以做开发并请人现场测试,并且通常可以正常工作。不过,有时我会遇到更难的问题。为了解决这个问题,我想设置一个虚拟 COM 端口,其中 COM 端口的一侧是我的应用程序,另一侧是一个非常简单的 COM 端口调试控制台(类似于旧的调制解调器终端程序),其中 ASCII 命令我应用程序发送记录在屏幕上,我可以输入一些 ASCII 命令发送回我的应用程序以模拟硬件设备。我一直找不到任何提供虚拟/软件 COM 端口和控制台/终端进行调试的工具。

软件/虚拟 COM 端口和终端需要支持 Windows 7 64 位(或必要时 Vista 32)。

0 投票
2 回答
885 浏览

c++ - 如何使读取功能不挂起?

我正在使用 socat 创建一个虚拟串行端口:

在我用 C++ 编写的程序中,我打开 ttySV1 端口并开始读取。

读取功能在一段时间内,但问题是读取功能挂起,直到我将数据发送到端口。如果缓冲区中没有数据,您知道如何使 taht 函数不挂起并退出吗?

编辑:我使用以下方法将数据发送到端口:

0 投票
2 回答
4076 浏览

c++ - 使用 C++ 扫描本地 Windows 系统以查找连接的 USB 设备

使用 C++ 扫描本地 Windows 系统以查找连接的 USB 设备的最佳方法是什么?我需要获取供应商和产品 ID 列表以与我的设备 ID 匹配。如果有办法扫描特定的 VID/PID 组合,那就更好了。我的最终目标是检索 Windows 分配给设备的虚拟 COM 端口。如果有办法做到这一切,那就太棒了。与往常一样,非常感谢示例。谢谢。

0 投票
4 回答
49624 浏览

c++ - 使用 C++ 在 Windows 中检测 USB 插入/移除事件

我正在为需要处理 USB 插入/移除事件的现有应用程序编写扩展。我知道感兴趣设备的 VID/PID。但是,我无权访问窗口句柄,所以我不知道是否RegisterDeviceNotification会有很大用处,除非有办法通过WINAPI. 使用 C++ 检测 USB 插入/移除事件的最佳方法是什么?

Microsoft 网站上的此示例代码显示了如何通过 WMI 接收事件通知:

如何修改它以接收 USB 插入/移除事件?或者,我还有其他方法吗?我正在使用 Visual Studio 2008。谢谢。

附加信息

这是我到目前为止所拥有的(减去错误处理):

PC 进入WndProc,但当我移除/插入我的 USB 设备时没有。PC 似乎永远无法进入OnDeviceChange. 任何提示将不胜感激。我需要处理 USB 设备的意外插入/移除。如果有所不同,USB 设备将显示为 Windows 的虚拟 COM 端口。谢谢。

附加信息:使用返回CreateWindowEx的类调用失败并显示错误消息“找不到窗口类”。atomRegisterClassEx

新的方法

我也在尝试这种新方法。我正在尝试编写一个仅消息窗口来接收 USB 设备的设备更改通知消息。我正在使用 MFC、C++ 和 Visual Studio 2008。一切都可以编译,并且运行时不会崩溃或锁定,但永远不会触发事件处理程序。感兴趣的设备作为虚拟 COM 端口安装在 Windows 上。

我的主应用程序实例化下面描述的类,然后使用 while 循环等待来自键盘轮询的字符输入。正是在这段等待时间内,我移除并插入了我的 USB 设备,期望事件被触发。

为简单起见,我删除了所有清理和错误处理:

任何想法或建议将不胜感激。如果缺少任何细节,请告诉我,我很乐意添加它们。谢谢。

仅消息窗口是否需要在新线程中启动,或者创建新窗口是否会自动派生新线程?

0 投票
1 回答
805 浏览

gps - GPS 中间驱动程序 减慢来自虚拟串行端口驱动程序的数据

继续 - GPS 中间驱动程序问题

以上没有成功回答,我觉得我有关于这个问题的新信息可以提出一个新问题。

我面临的问题是 GPS 中间驱动程序传输数据的速度。

我已成功使用 Pocket Putty 读取串行端口并查看暴露的确切信息。

COM 1 - GPS 中间驱动程序

COM 6 - 到 PC 的串行端口(手动输入数据)

COM 8 - GPS 硬件的虚拟串行端口。

读取 COM 8 时,我可以看到大约每 3 秒出现 18 个 NMEA 字符串,这是我们可以通过有限的 USB 连接将其推送的最快速度。它很快出现在显示屏上。读取 COM 6(手动从 PC 发送数据)时,显示速度同样快。因此,可用的数据没有问题。

输入 GPS 中间驱动程序。当 GPS 中间驱动程序设置为 COM1(软件)和 COM6(硬件)时。在 COM6 上输入的数据在 COM1 上的显示速度与没有 GPS 中间驱动程序时一样快。数据没有改变,所以如果我在 COM6 上发送“JON”,它会出现在 COM1 上,即使它不是有效的 NMEA 数据,这很好。

问题出在 COM8 上。GPS 中间驱动程序设置为 COM1(软件)和 COM8(硬件)时。在 COM1 上的 PocketPutty 中显示的数据非常慢。屏幕上的输出大约是每秒 5 个字符,数据是有效的,但它只是传递得很慢。这对我来说指出了虚拟串行端口的实现中的一个问题,就好像 GPS 中间驱动程序不是一次只读取一个字符的所有数据一样,因为我已将问题隔离到我的虚拟串行端口。

任何人都可以提供一个虚拟串行端口实现的清晰示例,因为我不确定我可以改变什么来改进这一点,因为 COM8 直接与 GPS 软件和 PocketPutty 应用程序一起使用,这表明数据可用、正在读取并且是正确的.

0 投票
1 回答
908 浏览

c++ - 移除 USB 设备时以编程方式中断串行 I/O - C++

我有一个应用程序,其中串行 I/O 是通过虚拟 COM 端口与连接的 USB 设备进行的。当检测到设备意外移除时,停止串行 I/O 的最佳方法是什么。我应该简单地关闭端口吗?或者,是否应该有一个全局变量来指示设备的存在,在尝试发送/接收数据之前,应该在每个串行 I/O 函数中检查该变量?或者,它应该是两者的结合,还是别的什么?谢谢。