예제 #1
0
파일: CommBase.cs 프로젝트: Rain-Time/test
        private void ReceiveThread()
        {
            uint num;
            uint num1 = 0;
            uint num2 = 0;

            byte[]         numArray       = new byte[1];
            bool           flag           = true;
            AutoResetEvent autoResetEvent = new AutoResetEvent(false);

            Win32Com.OVERLAPPED handle = new Win32Com.OVERLAPPED();
            uint   num3    = 0;
            IntPtr intPtr  = Marshal.AllocHGlobal(Marshal.SizeOf(handle));
            IntPtr intPtr1 = Marshal.AllocHGlobal(Marshal.SizeOf(num3));

            handle.Offset     = 0;
            handle.OffsetHigh = 0;
            handle.hEvent     = autoResetEvent.Handle;
            Marshal.StructureToPtr(handle, intPtr, true);
            try
            {
                while (Win32Com.SetCommMask(this.hPort, 0x1fd))
                {
                    Marshal.WriteInt32(intPtr1, 0);
                    if (flag)
                    {
                        this.startEvent.Set();
                        flag = false;
                    }
                    if (!Win32Com.WaitCommEvent(this.hPort, intPtr1, intPtr))
                    {
                        if ((long)Marshal.GetLastWin32Error() != (long)0x3e5)
                        {
                            throw new CommPortException("IO Error [002]");
                        }
                        else
                        {
                            autoResetEvent.WaitOne();
                        }
                    }
                    num3 = (uint)Marshal.ReadInt32(intPtr1);
                    if ((num3 & 128) != 0)
                    {
                        if (!Win32Com.ClearCommError(this.hPort, out num1, IntPtr.Zero))
                        {
                            throw new CommPortException("IO Error [003]");
                        }
                        else
                        {
                            int           num4          = 0;
                            StringBuilder stringBuilder = new StringBuilder("UART Error: ", 40);
                            if ((num1 & 8) != 0)
                            {
                                stringBuilder = stringBuilder.Append("Framing,");
                                num4++;
                            }
                            if ((num1 & 0x400) != 0)
                            {
                                stringBuilder = stringBuilder.Append("IO,");
                                num4++;
                            }
                            if ((num1 & 2) != 0)
                            {
                                stringBuilder = stringBuilder.Append("Overrun,");
                                num4++;
                            }
                            if ((num1 & 1) != 0)
                            {
                                stringBuilder = stringBuilder.Append("Receive Cverflow,");
                                num4++;
                            }
                            if ((num1 & 4) != 0)
                            {
                                stringBuilder = stringBuilder.Append("Parity,");
                                num4++;
                            }
                            if ((num1 & 0x100) != 0)
                            {
                                stringBuilder = stringBuilder.Append("Transmit Overflow,");
                                num4++;
                            }
                            if (num4 <= 0)
                            {
                                if (num1 != 16)
                                {
                                    throw new CommPortException("IO Error [003]");
                                }
                                else
                                {
                                    num3 = num3 | 64;
                                }
                            }
                            else
                            {
                                stringBuilder.Length = stringBuilder.Length - 1;
                                throw new CommPortException(stringBuilder.ToString());
                            }
                        }
                    }
                    if ((num3 & 1) != 0)
                    {
                        do
                        {
                            num = 0;
                            if (Win32Com.ReadFile(this.hPort, numArray, 1, out num, intPtr))
                            {
                                if (num != 1)
                                {
                                    continue;
                                }
                                this.OnRxChar(numArray[0]);
                            }
                            else
                            {
                                Marshal.GetLastWin32Error();
                                throw new CommPortException("IO Error [004]");
                            }
                        }while (num > 0);
                    }
                    if ((num3 & 4) != 0)
                    {
                        lock (this.empty)
                        {
                            this.empty[0] = true;
                        }
                        this.OnTxDone();
                    }
                    if ((num3 & 64) != 0)
                    {
                        this.OnBreak();
                    }
                    uint num5 = 0;
                    if ((num3 & 8) != 0)
                    {
                        num5 = num5 | 16;
                    }
                    if ((num3 & 16) != 0)
                    {
                        num5 = num5 | 32;
                    }
                    if ((num3 & 32) != 0)
                    {
                        num5 = num5 | 128;
                    }
                    if ((num3 & 0x100) != 0)
                    {
                        num5 = num5 | 64;
                    }
                    if (num5 == 0)
                    {
                        continue;
                    }
                    if (Win32Com.GetCommModemStatus(this.hPort, out num2))
                    {
                        this.OnStatusChange(new CommBase.ModemStatus(num5), new CommBase.ModemStatus(num2));
                    }
                    else
                    {
                        throw new CommPortException("IO Error [005]");
                    }
                }
                throw new CommPortException("IO Error [001]");
            }
            catch (Exception exception1)
            {
                Exception exception = exception1;
                Win32Com.CancelIo(this.hPort);
                if (intPtr1 != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(intPtr1);
                }
                if (intPtr != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(intPtr);
                }
                if (exception as ThreadAbortException == null)
                {
                    this.rxException = exception;
                    this.OnRxException(exception);
                }
            }
        }
예제 #2
0
파일: CommBase.cs 프로젝트: Rain-Time/test
        public bool Open()
        {
            Win32Com.COMMPROP cOMMPROP;
            bool flag;

            Win32Com.DCB          xoffChar    = new Win32Com.DCB();
            Win32Com.COMMTIMEOUTS cOMMTIMEOUT = new Win32Com.COMMTIMEOUTS();
            Win32Com.OVERLAPPED   zero        = new Win32Com.OVERLAPPED();
            if (!this.online)
            {
                CommBase.CommBaseSettings commBaseSetting = this.CommSettings();
                this.hPort = Win32Com.CreateFile(commBaseSetting.port, 0xc0000000, 0, IntPtr.Zero, 3, 0x40000000, IntPtr.Zero);
                if (this.hPort == (IntPtr)(-1))
                {
                    if ((long)Marshal.GetLastWin32Error() != (long)5)
                    {
                        this.hPort = Win32Com.CreateFile(this.AltName(commBaseSetting.port), 0xc0000000, 0, IntPtr.Zero, 3, 0x40000000, IntPtr.Zero);
                        if (this.hPort == (IntPtr)(-1))
                        {
                            if ((long)Marshal.GetLastWin32Error() != (long)5)
                            {
                                throw new CommPortException("Port Open Failure");
                            }
                            else
                            {
                                return(false);
                            }
                        }
                    }
                    else
                    {
                        return(false);
                    }
                }
                this.online = true;
                cOMMTIMEOUT.ReadIntervalTimeout        = 0xffffffff;
                cOMMTIMEOUT.ReadTotalTimeoutConstant   = 0;
                cOMMTIMEOUT.ReadTotalTimeoutMultiplier = 0;
                if (commBaseSetting.sendTimeoutMultiplier != 0)
                {
                    cOMMTIMEOUT.WriteTotalTimeoutMultiplier = commBaseSetting.sendTimeoutMultiplier;
                }
                else
                {
                    if (Environment.OSVersion.Platform != PlatformID.Win32NT)
                    {
                        cOMMTIMEOUT.WriteTotalTimeoutMultiplier = 0x2710;
                    }
                    else
                    {
                        cOMMTIMEOUT.WriteTotalTimeoutMultiplier = 0;
                    }
                }
                cOMMTIMEOUT.WriteTotalTimeoutConstant = commBaseSetting.sendTimeoutConstant;
                Win32Com.DCB dCBPointer;
                dCBPointer = xoffChar;
                if (commBaseSetting.parity == CommBase.Parity.odd)
                {
                    flag = true;
                }
                else
                {
                    flag = commBaseSetting.parity == CommBase.Parity.even;
                }
                dCBPointer.init(flag, commBaseSetting.txFlowCTS, commBaseSetting.txFlowDSR, (int)commBaseSetting.useDTR, commBaseSetting.rxGateDSR, !commBaseSetting.txWhenRxXoff, commBaseSetting.txFlowX, commBaseSetting.rxFlowX, (int)commBaseSetting.useRTS);
                xoffChar.BaudRate = commBaseSetting.baudRate;
                xoffChar.ByteSize = (byte)commBaseSetting.dataBits;
                xoffChar.Parity   = (byte)commBaseSetting.parity;
                xoffChar.StopBits = (byte)commBaseSetting.stopBits;
                xoffChar.XoffChar = (byte)commBaseSetting.XoffChar;
                xoffChar.XonChar  = (byte)commBaseSetting.XonChar;
                if ((commBaseSetting.rxQueue != 0 || commBaseSetting.txQueue != 0) && !Win32Com.SetupComm(this.hPort, (uint)commBaseSetting.rxQueue, (uint)commBaseSetting.txQueue))
                {
                    this.ThrowException("Bad queue settings");
                }
                if (commBaseSetting.rxLowWater == 0 || commBaseSetting.rxHighWater == 0)
                {
                    if (!Win32Com.GetCommProperties(this.hPort, out cOMMPROP))
                    {
                        cOMMPROP.dwCurrentRxQueue = 0;
                    }
                    if (cOMMPROP.dwCurrentRxQueue <= 0)
                    {
                        byte  num  = 8;
                        short num1 = (short)num;
                        xoffChar.XonLim  = (short)num;
                        xoffChar.XoffLim = num1;
                    }
                    else
                    {
                        short num2 = (short)(cOMMPROP.dwCurrentRxQueue / 10);
                        short num3 = num2;
                        xoffChar.XonLim  = num2;
                        xoffChar.XoffLim = num3;
                    }
                }
                else
                {
                    xoffChar.XoffLim = (short)commBaseSetting.rxHighWater;
                    xoffChar.XonLim  = (short)commBaseSetting.rxLowWater;
                }
                if (!Win32Com.SetCommState(this.hPort, ref xoffChar))
                {
                    this.ThrowException("Bad com settings");
                }
                if (!Win32Com.SetCommTimeouts(this.hPort, ref cOMMTIMEOUT))
                {
                    this.ThrowException("Bad timeout settings");
                }
                this.stateBRK = 0;
                if (commBaseSetting.useDTR == CommBase.HSOutput.none)
                {
                    this.stateDTR = 0;
                }
                if (commBaseSetting.useDTR == CommBase.HSOutput.online)
                {
                    this.stateDTR = 1;
                }
                if (commBaseSetting.useRTS == CommBase.HSOutput.none)
                {
                    this.stateRTS = 0;
                }
                if (commBaseSetting.useRTS == CommBase.HSOutput.online)
                {
                    this.stateRTS = 1;
                }
                this.checkSends = commBaseSetting.checkAllSends;
                zero.Offset     = 0;
                zero.OffsetHigh = 0;
                if (!this.checkSends)
                {
                    zero.hEvent = IntPtr.Zero;
                }
                else
                {
                    zero.hEvent = this.writeEvent.Handle;
                    // zero.hEvent = this.writeEvent.SafeWaitHandle;
                }
                this.ptrUWO = Marshal.AllocHGlobal(Marshal.SizeOf(zero));
                Marshal.StructureToPtr(zero, this.ptrUWO, true);
                this.writeCount          = 0;
                this.empty[0]            = true;
                this.dataQueued          = false;
                this.rxException         = null;
                this.rxExceptionReported = false;
                this.rxThread            = new Thread(new ThreadStart(this.ReceiveThread));
                this.rxThread.Name       = "CommBaseRx";
                this.rxThread.Priority   = ThreadPriority.AboveNormal;
                this.rxThread.Start();
                this.startEvent.WaitOne(0x1f4, false);
                this.auto = false;
                if (!this.AfterOpen())
                {
                    this.Close();
                    return(false);
                }
                else
                {
                    this.auto = commBaseSetting.autoReopen;
                    return(true);
                }
            }
            else
            {
                return(false);
            }
        }