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