/// <summary> /// 读取寄存器数据 /// </summary> /// <param name="StartAdd">int,寄存器开始地址</param> /// <param name="PointCount">int,读取个数</param> /// <param name="mReturnBuff">byte[],读取到的数据,mReturnBuff.Length应该为PointCount*2</param> /// <returns></returns> public bool StandarBoardRead(int StartAdd, int PointCount, ref byte[] mReturnBuff) { int i; byte[] WriteBuff = new byte[10]; //发送数据 byte[] ReadBuff = new byte[2 * PointCount + 5]; //接收数据 int ReturnByte = 0; //返回数据 bool IsReturn = false; //是否成功返回 bool IsTimeOut = false; //是否超时 DateTime NowTime; //当前时间 TimeSpan ts; //时间差 byte CrcHi = 0, CrcLo = 0; //CRC校验 if (cMain.isDebug) { for (i = 0; i < PointCount; i++) { mReturnBuff[i] = (byte)(20 + (byte)(Num.Rand() * 10)); } return(true); } if (!mStandarBoardInit)//没有初始化 { StandarBoardInit(); return(false); } //byte NowByte; try { WriteBuff[0] = _StandarModebusAddress; WriteBuff[1] = 0x03; WriteBuff[2] = (byte)((StartAdd & 0xFF00) >> 8); WriteBuff[3] = (byte)(StartAdd & 0x00FF); WriteBuff[4] = (byte)((PointCount & 0xFF00) >> 8); WriteBuff[5] = (byte)(PointCount & 0x00FF); cMain.CRC_16(WriteBuff, 6, ref CrcLo, ref CrcHi); WriteBuff[6] = CrcLo; WriteBuff[7] = CrcHi; if (!comPort.IsOpen) { comPort.Open(); } comPort.DiscardInBuffer();//刷新串口 comPort.Write(WriteBuff, 0, 8); NowTime = DateTime.Now; do { //System.Windows.Forms.Application.DoEvents(); Threading.Thread.Sleep(50); if (comPort.BytesToRead >= (2 * WriteBuff[5] + 5))//收到数据 { ReturnByte = comPort.BytesToRead; IsReturn = true; } ts = DateTime.Now - NowTime; if (ts.TotalMilliseconds > timeOut)//时间超时 { IsTimeOut = true; } } while (!IsReturn && !IsTimeOut); if (!IsReturn && IsTimeOut)//超时 { if (ErrStr.IndexOf("接收数据已超时") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardRead," + ":读取失败,接收数据已超时" + (char)13 + (char)10; } return(false); } comPort.Read(ReadBuff, 0, ReturnByte); if ((ReadBuff[0] != WriteBuff[0]) || (ReadBuff[1] != WriteBuff[1]))//数据检验失败 { if (ErrStr.IndexOf("接收数据错误") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardRead," + ":读取失败,接收数据错误" + (char)13 + (char)10; } return(false); } else { for (i = 0; i < PointCount * 2; i++) { mReturnBuff[i] = ReadBuff[i + 3]; } } } catch (Exception exc) { if (ErrStr.IndexOf(exc.ToString()) < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardRead," + ":" + exc.ToString() + (char)13 + (char)10; } return(false); } return(true); }