C#虚拟串行端口写入时超时异常
我在C#中的虚拟串行端口有问题:当我调用Write函数时,它会自动抛出TimeOutException,但客户端会接收数据 这只会发生在虚拟端口上(我使用的是HDDSoftware的免费虚拟串行端口,带有桥接器COM12COM13)。我用Visual Studio打开COM12,用Hercules打开COM13。应用程序抛出超时异常,但Hercules收到消息 我设置1000ms或100000ms的读/写端口超时并不重要 谢谢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
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因此,部分缓冲区仍将到达另一端。无法区分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);