2

シリアル ポートに書き込むプログラムを作成する必要がありますが、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;
    }

足りないものはありますか?関連性があるかどうかはわかりませんが、Serial To USB Adapters を使用しています。

編集: Windows XP と .Net 4.0 を使用しています。行は 50 文字を超えず、EOL 文字で終わります。

4

2 に答える 2

3

おそらく今までに解決した古い質問であることは知っていますが、まだ受け入れられた答えはありません。私は昨日同じ問題を抱えていましたが、それを修正したようです - 書き込みタイムアウトを設定していましたか?

_serialPort.WriteTimeout = 500;

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

于 2013-11-14T11:05:31.360 に答える
0

また、を設定する必要がありPortNameます。ポートのリストはから取得できますGetPortNamesCOM1これは通常、またはのようになりますCOM2

于 2012-04-05T13:44:01.900 に答える