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

Thi*_*Ybt 2 .net c# serial-port

我必须编写一个在串行端口上写入的程序,但有时对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;
    }
Run Code Online (Sandbox Code Playgroud)

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

编辑:我正在使用带有.Net 4.0的Windows XP.该行不超过50个字符,以EOL字符结束.

CJB*_*rew 5

我知道这是一个老问题,你现在可能已经解决了,但还没有接受的答案.昨天我遇到了同样的问题,似乎已经解决了 - 你设置了写超时吗?

_serialPort.WriteTimeout = 500;
Run Code Online (Sandbox Code Playgroud)

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

  • 那么你可以很容易地查看他的代码,你会发现他设置了 port.WriteTimeout = 5000; 所以你的回答在这里毫无用处。 (2认同)

SwD*_*n81 0

您还需要设置PortName. 您可以从 获取端口列表GetPortNames。这通常类似于COM1或COM2