Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#虚拟串行端口写入时超时异常_C#_Serial Port_Port_Timeoutexception_Virtual Serial Port - Fatal编程技术网

C#虚拟串行端口写入时超时异常

C#虚拟串行端口写入时超时异常,c#,serial-port,port,timeoutexception,virtual-serial-port,C#,Serial Port,Port,Timeoutexception,Virtual Serial Port,我在C#中的虚拟串行端口有问题:当我调用Write函数时,它会自动抛出TimeOutException,但客户端会接收数据 这只会发生在虚拟端口上(我使用的是HDDSoftware的免费虚拟串行端口,带有桥接器COM12COM13)。我用Visual Studio打开COM12,用Hercules打开COM13。应用程序抛出超时异常,但Hercules收到消息 我设置1000ms或100000ms的读/写端口超时并不重要 谢谢 using (SerialPort port = n

我在C#中的虚拟串行端口有问题:当我调用Write函数时,它会自动抛出TimeOutException,但客户端会接收数据

这只会发生在虚拟端口上(我使用的是HDDSoftware的免费虚拟串行端口,带有桥接器COM12COM13)。我用Visual Studio打开COM12,用Hercules打开COM13。应用程序抛出超时异常,但Hercules收到消息

我设置1000ms或100000ms的读/写端口超时并不重要

谢谢

        using (SerialPort port = new SerialPort("COM13"))
        {
            // configure serial port
            port.BaudRate = 9600;
            port.DataBits = 8;
            port.Parity = Parity.None;
            port.StopBits = StopBits.One;
            port.Open();

            port.ReadTimeout = 10000;

            byte[] buffer = Encoding.ASCII.GetBytes("HELLO WORLD");

            try
            {
                port.Write(buffer, 0, buffer.Length);
            }
            catch(TimeoutException)
            {
                Console.WriteLine("Write timeout");
            }

            Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
            try
            {
                byte[] buf = new byte[100];
                port.Read(buf, 0, 1);
            }
            catch(IOException)
            {
                Console.WriteLine("Read timeout");
            }
            Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
        }
在一些测试之后(将写操作放入try-catch),读取操作也会立即抛出TimeOutException

这是我运行测试时得到的结果。它应该是: 12:16:06 (读取超时) 12:16:16

如何实现这一点取决于设备驱动程序。但我所知道的所有调用都遵循一条规则,即允许底层调用返回*lpnumberofbytesswrited 一个不错的心智模型是Write()一次从缓冲区写入一个字节,计数次数。在某些情况下,完全不可预测的是,当驱动程序的传输缓冲区充满容量且无法存储另一个字节时,再写入一个字节将暂停。最终触发异常


因此,部分缓冲区仍将到达另一端。无法区分SerialPort类中的哪个部分。超时是一种很难恢复的严重通信故障。如果这是一个显示停止器,那么你需要考虑一次写入一个字节(好的,串行端口慢)或者注意写缓冲区大小- ByTestOrrt来检查缓冲区是否适合并实现你自己的超时。

< P>正如Hans Passant所说,这是一个虚拟COM软件的问题。我尝试使用Eltima软件的虚拟串行端口,效果很好

可能相关(虽然目前尚未回答):。这可能很有趣:@Groo是的,我看到了这一点并尝试了解决方案,但没有帮助。@jbutler483谢谢,但在这种情况下,当我调用write函数时会抛出异常,我不知道这个异常是因为端口有问题还是因为端口是一个虚拟com。你能发布一些代码来读取/写入数据吗?嗨,我试图一次写入一个字节,但在第一次写入时,我得到了TimeOutException。在问题中添加的示例中,在Hercules中,我只收到“HELLO WORLD”中的“H”。嗯,WriteBufferSize是多少,您将WriteTimeout属性设置为什么?指导是使其比任何程序读取端口的预期延迟长10倍。在Windows或Linux等按需分页的虚拟内存操作系统上,这很容易达到数百毫秒。因此,不要使用小于5000的值。这些值是默认值,但尝试将WriteTimeOut设置为10000,并且相同。WriteBufferSize为2048,与此相同。我不知道虚拟端口发生了什么。WriteTimeout的默认值为0,并且在写入时不应产生TimeoutException。很明显,你使用的这个软件不是很可靠。联系供应商以获得支持。
   port.Write(buffer, offset, count);