3

我们有一个通过 USB 电缆连接并模拟 COM 端口的设备。在打开连接后使用我们旧的 VB6 应用程序和 MSComm 控件,每当 VB6 应用程序向设备发送一个字节时,设备就会返回一个字节。

现在,我们将 VB6 应用程序移植到 .Net 并使用SerialPort该类进行通信。port.Write成功了,但port.ReadByte遇到了我们使用TimeOutException的每一个可以想到的问题。ReadTimeOut

从表面上看,波特率、奇偶校验等所有设置都是相同的。奇怪的是,如果我们首先启动旧的 VB6 应用程序并关闭它(连接到设备),.Net 代码也会开始工作,直到我们拔下并重新插入设备。

因此,在某种程度上,MSComm 控件以一种SerialPort无法实现的方式使设备栩栩如生。VB6 应用程序中打开连接并开始通信的代码很简单,并且已转换为 C#。

我使用端口监视器查看实际发送了哪些数据,并且确实 MSComm 控件在开始实际数据传输之前向设备发送了更多的控制字节。我能够辨别的唯一有意义的区别是 MSComm 控件对 Xon Xof、EvtChar 等使用了其他控制字符。但是在调整了这些之后SerialPort见这个链接没有任何改变。

还有什么可以发生的?是否应该更仔细地调查通过端口发送的数据最终给出答案,还是完全是其他事情?

4

1 回答 1

0

确保 MSComm 端口已打开(当您的程序初始化并与设备通信时)

在 C# .NET 中,它类似于:

  serialPort = new SerialPort();

            if (serialPort is SerialPort)
            {
                serialPort.PortName = "COM1";
                serialPort.DataBits = 8;
                serialPort.Parity = Parity.None;
                serialPort.StopBits = StopBits.One;
                serialPort.BaudRate = 9600;

                try
                {
                    serialPort.Open();

/// and other commands

}}

于 2020-12-08T10:11:46.543 回答