gpt4 book ai didi

c# - SerialPort.Write 方法挂起,超时未在 C# 中触发

转载 作者:行者123 更新时间:2023-12-04 05:51:08 31 4
gpt4 key购买 nike

我必须编写一个在串行端口上写入的程序,但有时对 Write 方法的调用会挂起并且 WriteTimeout 永远不会触发,所以我的程序会无限期地挂起。

这是端口创建代码:

   void DetectX1BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
String[] ports = SerialPort.GetPortNames();
int i = 0;
foreach (string PortName in ports)
{
try
{
Console.WriteLine("Trying to open:" + PortName);
SerialPort port = openSerial(PortName);
Console.WriteLine("Port is open:" + PortName);
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
port.Write("$ST+IMEI=0000\r\n");
if (IMEIFoundEvent.WaitOne(250))
{
Console.WriteLine("IMEI Found:[" + imei + "]");
if (addresses.ContainsKey(imei))
{
((BackgroundWorker)sender).ReportProgress(0, new X1Model(imei, PortName, addresses[imei]));
}
else
Console.WriteLine("imei not in file: " + imei);
}
port.Close();

}
catch (Exception ex)
{
Console.WriteLine("Erreur port " + PortName + ex.Message);
}
finally
{
i++;
((BackgroundWorker)sender).ReportProgress(i * 100 / ports.Length);
}
}
}

private SerialPort openSerial(string PortName)
{
SerialPort port = new SerialPort(PortName);
port.BaudRate = 57600;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.ReceivedBytesThreshold = 1;
port.Handshake = Handshake.None;
port.DtrEnable = true;
port.RtsEnable = true;
port.WriteTimeout = 5000;
port.ReadTimeout = 5000;
if (!port.IsOpen)
port.Open();
return port;
}

有什么我想念的吗?我不知道它是否相关,但我使用的是串口转 USB 适配器。

编辑:我使用的是带有 .Net 4.0 的 Windows XP。该行不超过 50 个字符且以 EOL 字符结尾。

最佳答案

我知道这是一个老问题,您现在可能已经解决了,但还没有公认的答案。我昨天遇到了同样的问题,似乎已经解决了——您是否设置了写入超时?

_serialPort.WriteTimeout = 500;

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.writetimeout.aspx

关于c# - SerialPort.Write 方法挂起,超时未在 C# 中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10029597/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com