Beispiel #1
0
        //1C帧的接收处理
        private void ComRecvProc()
        {
            //string strRecv = serialPort.ReadExisting();
            byte[] buf = new byte[recvMax];
            while (!recvExit)
            {
                Thread.Sleep(recvInterval);
                // Console.WriteLine("begin recv:");
                if (!serialPort.IsOpen || (!isConnect))
                {
                    continue;
                }
                int recvLen = 0;
                try
                {
                    recvLen = serialPort.Read(buf, 0, 128);

                    for (int i = 0; i < recvLen; i++)
                    {
                        //   Console.WriteLine("recv:0x{0}",buf[i].ToString("X2"));
                        if (recvBytes >= recvMax)
                        {
                            break;
                        }
                        switch (buf[i])
                        {
                        case STX:
                        {
                            Array.Clear(recvBuffer, 0, recvBuffer.Count());
                            recvBytes               = 0;
                            recvBegin               = true;
                            this.currentRecvType    = RecvPackageType.RECV_STX;
                            recvBuffer[recvBytes++] = buf[i];
                            break;
                        }

                        case ACK:
                        {
                            Array.Clear(recvBuffer, 0, recvBuffer.Count());
                            recvBytes               = 0;
                            recvBegin               = true;
                            this.currentRecvType    = RecvPackageType.RECV_ACK;
                            recvBuffer[recvBytes++] = buf[i];
                            break;
                        }

                        case ETX:
                        {
                            responseOk = true;
                            recvBegin  = false;
                            recvBuffer[recvBytes++] = buf[i];
                            recvAutoEvent.Set();
                            serialPort.DiscardInBuffer();
                            break;
                        }

                        case NAK:
                        {
                            //Console.Write("recv from plc: NAK " + recvLen.ToString());
                            responseOk = false;
                            recvAutoEvent.Set();
                            // AddLog("FX PLC 站号:" + plcStationNumber + ",收到NAK 错误应答", EnumLogType.错误);
                            //if (eventLinkLost != null)
                            //{
                            //    eventLinkLost.Invoke(this, null);
                            //}
                            break;
                        }

                        default:
                        {
                            if (recvBegin)
                            {
                                recvBuffer[recvBytes++] = buf[i];
                            }
                            else
                            {
                                string log = string.Format("FX PLC 站号{0},通信错误,未收到STX或ACK起始标志符,收到无效数据:buf[{1}]={2}", plcStationNumber, i, buf[i]);
                                //AddLog(log, EnumLogType.错误);
                                serialPort.DiscardInBuffer();
                                //if (eventLinkLost != null)
                                //{
                                //    eventLinkLost.Invoke(this, null);
                                //}
                            }
                            if ((this.currentRecvType == RecvPackageType.RECV_ACK) && (recvBytes == 5))
                            {
                                //应答包结束
                                responseOk = true;
                                recvBegin  = false;
                                recvAutoEvent.Set();
                                serialPort.DiscardInBuffer();
                            }
                            break;
                        }
                        }
                    }
                }
                catch (System.Exception ex)
                {
                    serialPort.Close();
                    isConnect = false;
                    //AddLog("FX PLC 站号:"+plcStationNumber+",接收数据遇到异常:"+ex.ToString(), EnumLogType.错误);
                    //if (eventLinkLost != null)
                    //{
                    //    eventLinkLost.Invoke(this, null);
                    //}
                }

                if (recvLen > 0 && comRecvHandler != null)
                {
                    byte[] recvBytesReal = new byte[recvLen];
                    Array.Copy(buf, recvBytesReal, recvLen);
                    ComRwBytesEventArgs args = new ComRwBytesEventArgs();
                    args.buf = recvBytesReal;
                    comRecvHandler.Invoke(this, args);
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// 4C帧,报文格式5的接收处理
        /// </summary>
        private void ComRecvProc2()
        {
            byte[] buf = new byte[recvMax];
            while (!recvExit)
            {
                Thread.Sleep(recvInterval);
                if (!serialPort.IsOpen || (!isConnect))
                {
                    continue;
                }
                int recvLen = 0;
                try
                {
                    recvLen = serialPort.Read(buf, 0, 128);
                    for (int i = 0; i < recvLen; i++)
                    {
                        if (recvBytes >= recvMax)
                        {
                            break;
                        }
                        switch (buf[i])
                        {
                        case STX:
                        {
                            Array.Clear(recvBuffer, 0, recvBuffer.Count());
                            recvBytes               = 0;
                            responseOk              = false;
                            recvBegin               = true;
                            this.currentRecvType    = RecvPackageType.RECV_STX;
                            recvBuffer[recvBytes++] = buf[i];
                            break;
                        }

                        case ETX:
                        {
                            responseOk = true;
                            recvBegin  = false;
                            recvBuffer[recvBytes++] = buf[i];
                            recvAutoEvent.Set();
                            serialPort.DiscardInBuffer();
                            break;
                        }

                        default:
                        {
                            if (recvBegin)
                            {
                                recvBuffer[recvBytes++] = buf[i];
                            }
                            break;
                        }
                        }
                    }


                    if (recvLen > 0 && comRecvHandler != null)
                    {
                        byte[] recvBytesReal = new byte[recvLen];
                        Array.Copy(buf, recvBytesReal, recvLen);
                        ComRwBytesEventArgs args = new ComRwBytesEventArgs();
                        args.buf = recvBytesReal;
                        comRecvHandler.Invoke(this, args);
                    }
                }
                catch (Exception)
                {
                    serialPort.Close();
                    isConnect = false;
                    throw;
                }
            }
        }