void SendData(RequestUnit RequestUnit) { if (!IsOpen) { return; } lock (locker) { portBusy = true; } SendDataHandler senddelegate = new SendDataHandler(SendDataBody); senddelegate.BeginInvoke(RequestUnit, null, null); }
void AddRequest(byte[] TxBuffer, int ReceivedBytesThreshold, DataRecievedRTU OnDataRecievedRTU, int RTUReadCount, RequestPriority RequestPriority, object param) { if (!IsOpen) { return; } if (RequestPriority == UniSerialPort.RequestPriority.High) { lock (locker) { requestsMain.Enqueue(new RequestUnit(TxBuffer, ReceivedBytesThreshold, OnDataRecievedRTU, RTUReadCount, param)); } } else { lock (locker) { var request = new RequestUnit(TxBuffer, ReceivedBytesThreshold, OnDataRecievedRTU, RTUReadCount, param); requests.Enqueue(request); } } }
void SendDataBody(RequestUnit RequestUnit) { if (portError) { return; } if (serialPortMode == SerialPortModes.TCPMode) { if (RequestUnit.PortAnswerType != PortAnswerType.RTU) { throw new Exception("Invalid request type"); } } if (serialPortMode == SerialPortModes.RSMode) { try { if (serialPort.BytesToRead != 0) { byte[] buff = new byte[serialPort.BytesToRead + 1]; serialPort.Read(buff, 0, serialPort.BytesToRead); } Thread.Sleep(3); serialPort.Write(RequestUnit.TxBuffer, 0, RequestUnit.TxBuffer.Length); } catch { portError = true; if (SerialPortError != null) { SerialPortError(serialPort, null); } return; } } tcpReadData = null; tcpWriteOk = false; if (serialPortMode == SerialPortModes.TCPMode) { if (RequestUnit.GetTCPFunction() == TCPFunctions.TCPRead) { tcpMaster.ReadHoldingRegister(1, RequestUnit.GetSlaveAddr(), RequestUnit.GetTCPStartAddr(), RequestUnit.GetTCPReadCount()); } else { tcpMaster.WriteMultipleRegister(1, RequestUnit.GetSlaveAddr(), RequestUnit.GetTCPStartAddr(), RequestUnit.GetTCPWriteData()); } } if (serialPortMode == SerialPortModes.RSMode) { waitSerialData.WaitOne(TimeSpan.FromMilliseconds(100)); for (int i = 0; i < 100; i++) { if (serialPort.BytesToRead < RequestUnit.ReceivedBytesThreshold) { waitSerialData.WaitOne(TimeSpan.FromMilliseconds(10)); } else { break; } } } if (serialPortMode == SerialPortModes.TCPMode) { waitSerialData.WaitOne(TimeSpan.FromMilliseconds(3000)); } bool dataOk = false; #region RecieveRS232 if (serialPortMode == SerialPortModes.RSMode) { byte[] rxBuffer = new byte[0]; if (serialPort.BytesToRead >= RequestUnit.ReceivedBytesThreshold) { int count = serialPort.BytesToRead; rxBuffer = new byte[count]; try { serialPort.Read(rxBuffer, 0, count); } catch { portError = true; if (SerialPortError != null) { SerialPortError(serialPort, null); } return; } dataOk = true; } else { // System.Windows.Forms.MessageBox.Show(RequestUnit.ReceivedBytesThreshold.ToString()); } switch (RequestUnit.PortAnswerType) { case PortAnswerType.Byte: { if (RequestUnit.DataRecieved != null) { RequestUnit.DataRecieved(dataOk, rxBuffer); } break; } case PortAnswerType.RTU: { ushort[] ubuff = new ushort[0]; if (!ModBusCRC.CheckCRC(rxBuffer, rxBuffer.Length)) { // System.Windows.Forms.MessageBox.Show("Ошибка CRC " + rxBuffer.Length.ToString()); dataOk = false; } else { if (rxBuffer[1] == 0x03) { ModBusCRC.RemoveData(rxBuffer, 3, RequestUnit.RTUReadCount, out ubuff); } else { ubuff = new ushort[0]; } dataOk = true; } if (RequestUnit.DataRecievedRTU != null) { RequestUnit.DataRecievedRTU(dataOk, ubuff, RequestUnit.Param); } } break; } } #endregion #region RecieveTCP if (serialPortMode == SerialPortModes.TCPMode) { if (RequestUnit.GetTCPFunction() == TCPFunctions.TCPRead) { dataOk = (tcpReadData != null); ushort[] us = new ushort[0]; if (dataOk) { ModBusCRC.RemoveData(tcpReadData, 0, RequestUnit.RTUReadCount, out us); } if (RequestUnit.DataRecievedRTU != null) { RequestUnit.DataRecievedRTU(dataOk, us, RequestUnit.Param); } } else { ushort[] us = new ushort[0]; if (RequestUnit.DataRecievedRTU != null) { RequestUnit.DataRecievedRTU(tcpWriteOk, us, RequestUnit.Param); } } } #endregion lock (locker) { bool b = CheckQueue(false); portBusy = b; } }