Embedded 虚拟通信问题

Embedded 虚拟通信问题,embedded,usb,.net-2.0,serial-communication,cdc,Embedded,Usb,.net 2.0,Serial Communication,Cdc,我正在为嵌入式设备开发一个通信设备类(CDC)驱动程序,这是一个USB 2.0的全速实现。COM端口设置为115200、8位、无奇偶校验、1停止位、无流量控制。我们的PC应用程序(32位,Windows 7,.NET 2.0)通过虚拟COM端口与目标设备通信,目标设备上的虚拟COM端口可以连接到FTDI(USB到SCI桥接)芯片或微控制器中的集成USB外围设备,具体取决于应用程序选择的端口 使用Realterm,两个虚拟COM端口都可以正常工作。然而,当我们的桌面应用程序使用通过FTDI芯片连接

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

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

使用集成USB通过虚拟COM端口连接时,应用程序始终挂起对
SerialPort.Write(…)
的第二次调用。使用我可以看到数据在第一次调用
SerialPort.Write(…)
时被传输。但是,目标设备从未接收到该数据

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

其他信息…


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

对于那个些感兴趣的人,我正在使用来自飞思卡尔的带有MCF51JM128的CodeWarrior 10.2



如有任何意见或建议,将不胜感激。谢谢。

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

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

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


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

您是否尝试跟踪Realterm的操作?一定有不同之处,应该能说明解决办法。@jeb我该怎么做?这是Realterm的功能之一吗?我承认我只熟悉它的一小部分功能。不,但是像Sysinterms/microsoft这样的工具可以显示端口的所有操作,打开/关闭,也可以读/写,对于Realterms和your Owner这样的其他程序,这是什么uC?意思是“微控制器中的集成USB外设”。我见过的大多数虚拟COM内容似乎都不太适合/优化。我怀疑坎特伯雷大学是这里的错。你必须记住,你把它交给uC会增加很多开销。我使用FTDI芯片组开发了一个非常类似的产品,带有COM端口/USB电缆。。。不确定我是否可以建议您尚未尝试的内容,但有两个快速(可能是愚蠢的)问题:您是否尝试将WriteTimeout设置为某个大数字(例如60秒)?另外,您是否正在尝试在写入之间关闭/重新打开COM端口?我发现后者的效果非常差(因为关闭端口的请求和实际关闭是异步的)!谢谢你富有洞察力的回答,让我回到了正确的轨道上!