Exemple #1
0
        void mComport_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int bytes = mComport.BytesToRead;

            byte[] buffer = new byte[bytes];

            mComport.Read(buffer, 0, bytes);


            recieveBuffer.AddRange(buffer);

            ArrayList remainder = ReceiveValue(recieveBuffer);

            recieveBuffer.Clear();
            recieveBuffer.AddRange(remainder);

            eHandler(new DK1DataArgs
            {
                address = "null",
                Data    = DK1Util.ByteArrayToHexString(buffer)
            });
        }
Exemple #2
0
        /// <summary>
        /// 실시간 데이터 읽기
        /// </summary>
        ///
        public int ModbusSerialAsciiMasterReadRegisters(SerialPort master, UInt16 dong, UInt16 ho, byte cmd)
        {
            byte[] buildPacket = new byte[7];    // read protocol size
            string recvBuffer  = "";

            byte[] checkBuffer = null;

            bool success = false;

            try
            {
                //3A30323034383030303030333234380D0A
                //3A 3032 3034 3830 3030 3030 3332 3438 0D 0A


                //modbus modbusUtil = new modbus();

                // 전송 패킷 생성
                //modbusUtil.BuildModbusAsciiMessage(slaveId, readType, startAddress, numRegisters, ref buildPacket);


                // 헥사 스트링으로 변환
                string convert = DK1Util.ByteArrayToHexString(buildPacket);

                // 공백문자제거
                convert = convert.Replace(" ", "");

                // STX, CR/LF 추가
                string sendMessage = string.Format(":{0}\r\n", convert);

                // 전송
                //success = modbusUtil.SendFc4(master, sendMessage, ref recvBuffer);
                if (success)
                {
                    checkBuffer = DK1Util.HexStringToByteArray(recvBuffer.Substring(1, recvBuffer.Length - 1));

                    //if (!modbusUtil.CheckLRCResponse(checkBuffer))
                    //    return -2;
                }
                else
                {
                    // 이벤트 전달
                    //TimeoutEventArgs timeoutPort = new TimeoutEventArgs(this.mLineName);
                    //OnTimeoutChanged(timeoutPort);

                    return(-1);
                }

                string [] dongho = new string[2];
                dongho[0] = string.Format("{0}", dong);
                dongho[1] = string.Format("{0}", ho);
                // BMS 리스트 테이블에 수신한 ID 찾기
                DataRow foundRow = mCommTable.Rows.Find(dongho);
                //DataRow foundErrRow = mErrorTable.Rows.Find(dongho);

                // 있다면 업데이트
                if (foundRow != null)
                {
                    int index = mCommTable.Rows.IndexOf(foundRow);


                    //foundRow["VOLT"] = string.Format("{0:F1}", curValue.Data[0]);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }


            return(0);
        }
Exemple #3
0
        private ArrayList ReceiveValue(ArrayList cvalue)
        {
            ArrayList remainder = new ArrayList();
            int       startIndex = 0;
            byte      tlen, dataLen = 0;

            byte[] data = new byte[cvalue.Count];

            cvalue.CopyTo(0, data, 0, cvalue.Count);

            int nextstartIndex = 0;



            for (startIndex = 0; startIndex < cvalue.Count;)
            {
                try
                {
                    // STX  LEN  검침기ID   CMD
                    // 1    1       4       1
                    //int offset = 2;
                    int indexof = cvalue.IndexOf(byte.Parse("2"), startIndex);
                    if (indexof == -1)
                    {
                        break;
                    }

                    if (cvalue.Count >= indexof + 6)
                    {
                        tlen = data[indexof + 1];
                    }
                    else
                    {
                        break;
                    }

                    if (cvalue.Count >= tlen)
                    {
                        dataLen = getDataLength(data[indexof + 6]);

                        DK1Util.GetCheckSum(data, indexof, tlen - 1);
                        DK1Util.GetCheckXOR(data, indexof, tlen - 2);

                        byte[] dk1data = new byte[dataLen];
                        cvalue.CopyTo(indexof + 7, dk1data, 0, dk1data.Length);

                        updateData(dk1data);
                        //getDataLength
                        //tlen = data[indexof + 1];
                        //// 파싱한 패킷 길이가 수신된 패킷의 길이 보다 클경우 에러 패킷을 판단하고 초기화 한다.
                        //if (tlen > cvalue.Count)
                        //{
                        //    remainder = new ArrayList();
                        //    return remainder;
                        //}


                        startIndex     = startIndex + tlen;
                        nextstartIndex = startIndex;
                    }
                    else
                    {
                        startIndex += indexof;
                    }
                }
                catch (Exception ex)
                {
                    //eHandler(new Dabom.CommPlugIn.Item.PlugInDriverState
                    //{
                    //    DeviceId = this.deviceid,
                    //    Message = string.Format(" Packet Error : [{0}][{1}]", data.Length, BitConverter.ToString(data, 0, data.Length).Replace("-", "")),
                    //    State = Dabom.CommPlugIn.Item.DriverState.Run_Read
                    //});
                    //eHandler(new Dabom.CommPlugIn.Item.PlugInDriverErrorArgs { DeviceId = this.deviceid, Mode = "Read:", Error = ex.Message });
                    remainder = new ArrayList();
                    return(remainder);
                }
            }

            if (cvalue.Count > startIndex)
            {
                remainder.AddRange(cvalue.GetRange(nextstartIndex + 1, cvalue.Count - nextstartIndex - 1));
            }
            else
            {
                remainder = new ArrayList();
            }

            return(remainder);
        }