我正在为嵌入式设备开发通信设备类(CDC)驱动程序,这是USB 2.0的全速实现。 COM端口设置为115200,8位,无奇偶校验,1个停止位,无流量控制。我们的PC应用程序(32位,Windows 7,.NET 2.0)通过虚拟COM端口与目标设备进行通信,目标设备可以连接到FTDI(USB-to-SCI桥接器)芯片或集成USB微控制器中的外设,取决于应用程序选择的端口。
两个虚拟COM端口在使用Realterm时都没有任何问题。但是,虽然我们的桌面应用程序使用通过FTDI芯片连接的虚拟COM端口,但在尝试使用通过微控制器的集成USB外围设备连接的虚拟COM时,它会挂起。
使用集成USB通过虚拟COM端口连接时,应用程序会在第二次调用SerialPort.Write(...)
时始终挂起。使用Serial Monitor from HHD Software我可以看到数据是在第一次调用SerialPort.Write(...)
时传输的。但是,目标设备从不接收该数据。
这很奇怪,因为我在以前的项目中遇到类似问题的唯一一次是总线两侧的流量控制设置不匹配。
其他信息......
这是从各种端口监控工具捕获的数据,同时运行通过其集成USB外围设备连接到目标设备的PC应用程序。任何见解都将不胜感激。
对于那些感兴趣的人,我使用CodeWarrior 10.2和飞思卡尔的MCF51JM128。
任何想法或建议将不胜感激。感谢。
答案 0 :(得分:3)
从日志中可以清楚地看出,你犯了一个经典的错误,即没有处理硬件握手信号。这只是偶然的,像Realterm这样的终端模拟器永远不会出错。
您必须将DtrEnable属性设置为true。这将打开数据终端就绪信号。这很重要,因为RS-232是未端接的总线,因此在电缆断开或电源关闭时会受到电噪声的影响。 DTR使设备确信它实际上已连接到有源设备。在您的情况下,这当然是模拟的,但驱动程序或固件仍然通常会实现RS-232行为。
RtsEnable属性很重要,用于与设备握手,并防止接收缓冲区在应用程序未及时清空缓冲区时溢出。你真的应该将Handshake属性设置为Handshake.RequestToSend,这是设备实现它的最常用方式。然后,它也负责打开RTS。如果您出于某种原因必须使用Handshake.None,那么您 可以通过将RtsEnable设置为true来自行打开它。
这应该解决这个问题。如果你仍然有问题,那么使用PortMon监视Realterm初始化驱动程序的方式。将您看到的命令与SerialPort类发送的命令进行比较。确保它们是相同的。在价值上,而不是按顺序。