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) }); }
/// <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); }
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); }