System.IO.IOException: A device attached to the system is not functioning C# .NET 4.0

后端 未结 3 1584
北荒
北荒 2021-02-05 04:07

I\'ve built a C# application which reads and writes data from a serial port. The device connected to the serial port is a FTDI USB to serial converter which communicates to hard

3条回答
  •  醉酒成梦
    2021-02-05 04:49

    I use intensively SerialPort class to communicate continuously with PLCs through USB Adapters for months without any break. So I cannot agree who says SerialPort .NET class does not work. Try to insert creation of class into thread, here is a sample of code with BackgroundWorker.

        void ThreadEngine_DoWork(object sender, DoWorkEventArgs e)
        {
            // Do not access the form's BackgroundWorker reference directly.
            // Instead, use the reference provided by the sender parameter.
            BackgroundWorker objBackgroundWorker = sender as BackgroundWorker;
    
            try
            {
                mSerialPort = new SerialPort(GetPortName(mPortName), DefaultBaudRate, Parity.Even, 7, StopBits.Two);
                mSerialPort.Open();
                objBackgroundWorker.ReportProgress(0);
    
                while (objBackgroundWorker.CancellationPending == false)
                {
                    if (IOScanner(objBackgroundWorker, false) == true)
                    {
                        ScannerStationData();
                        IsReady = true;
                        IsError = false;
                    }
                    else
                    {
                        IsReady = false;
                        IsError = true;
                    }
                    Thread.Sleep(1);
                }
    
                // Performs last scan before thread closing
                if (objBackgroundWorker.CancellationPending == true)
                {
                    IOScanner(objBackgroundWorker, true);
                }
    
                mSerialPort.Close();
                mSerialPort = null;
                e.Result = null;
            }
            catch (Exception objErr)
            {
                string sMessage = string.Format("PlcService.ThreadEngine_DoWork Err={0}", objErr.Message);
                mLogSysService.AddItem(sMessage);
                IsError = true;
            }
        }
    

    Method IOScanner calls other methods for to communicate like following one.

        protected bool WriteDMWord(int iAddress, int[] aryValues)
        {
            bool bRetValue = true;
            try
            {
                mSerialPort.NewLine = "\r";
                mSerialPort.ReadTimeout = DefaultTimeout;
                string sTxData = HostLinkProtocol.BuildWriteDMWord(iAddress, aryValues);
                mSerialPort.WriteLine(sTxData);
    
                string sRxData = string.Empty;
                sRxData = mSerialPort.ReadLine();
                if (HostLinkProtocol.ParseWriteDMWord(sRxData) == true)
                {
                    bRetValue = true;
                }
            }
            catch (Exception objErr)
            {
                Console.WriteLine("WriteDMWord [{0}]", objErr.Message);
                bRetValue = false;
            }
            return bRetValue;
        }
    

提交回复
热议问题