4

我正在为嵌入式设备开发通信设备类 (CDC) 驱动程序,即 USB 2.0 的全速实现。COM 端口设置为 115200、8 位、无奇偶校验、1 个停止位、无流量控制。我们的 PC 应用程序(32 位、Windows 7、.NET 2.0)通过虚拟 COM 端口与目标设备进行通信,目标设备上的该端口可以连接到 FTDI(USB-to-SCI 桥接器)芯片或集成的 USB微控制器中的外围设备,具体取决于应用程序选择的端口。

使用 Realterm 时,两个虚拟 COM 端口都可以正常工作。然而,虽然我们的桌面应用程序使用通过 FTDI 芯片连接的虚拟 COM 端口工作,但在尝试使用通过微控制器的集成 USB 外围设备连接的虚拟 COM 时,它会挂起。

当使用集成 USB 通过虚拟 COM 端口连接时,应用程序在第二次调用SerialPort.Write(...). 使用HHD Software 的串行监视器,我可以看到数据在第一次调用时传输到SerialPort.Write(...). 但是,目标设备永远不会接收到该数据。

这很奇怪,因为我在以前的项目中唯一一次看到类似问题是总线两侧的流量控制设置不匹配。

附加信息...


这是在运行通过集成 USB 外设连接到目标设备的 PC 应用程序时从各种端口监控工具捕获的数据。任何见解将不胜感激。

对于那些感兴趣的人,我正在使用 CodeWarrior 10.2 和飞思卡尔的 MCF51JM128。


任何想法或建议将不胜感激。谢谢。

4

1 回答 1

3

从日志中可以清楚地看出,您犯了不注意硬件握手信号的经典错误。这只是偶然的,像 Realterm 这样的终端仿真器永远不会犯这个错误。

您必须将 DtrEnable 属性设置为 true。这将打开数据终端就绪信号。这很重要,因为 RS-232 是未端接的总线,因此当电缆断开或电源关闭时会受到电气噪声的影响。DTR 使设备相信它实际上已连接到受电设备。这当然是在您的情况下模拟的,但驱动程序或固件通常仍会实现 RS-232 行为。

RtsEnable 属性很重要,用于与设备握手,防止应用程序未及时清空缓冲区时接收缓冲区溢出。您确实应该将 Handshake 属性设置为 Handshake.RequestToSend,这是设备实现它的最常见方式。然后它还负责打开 RTS。如果出于某种原因必须使用 Handshake.None,则必须通过将 RtsEnable 设置为 true 来自行打开它。

这应该解决问题。如果您仍然遇到问题,请使用 PortMon 监视 Realterm 初始化驱动程序的方式。将您看到的命令与 SerialPort 类发送的命令进行比较。确保它们相同。在价值上,而不是在顺序上。

于 2013-03-06T19:16:15.637 回答