public void BytesArrayRemoveLastTest( )
        {
            byte[] b1 = new byte[] { 0x13, 0xA6, 0x15, 0x85, 0x5B, 0x05, 0x12 };
            byte[] b2 = new byte[] { 0x13, 0xA6, 0x15 };

            byte[] buffer = SoftBasic.BytesArrayRemoveLast(b1, 4);
            Assert.IsTrue(SoftBasic.IsTwoBytesEquel(b2, buffer));
        }
        public void BytesArrayRemoveLastExample( )
        {
            #region BytesArrayRemoveLast

            byte[] b1 = new byte[] { 0x13, 0xA6, 0x15, 0x85, 0x5B, 0x05, 0x12 };

            byte[] buffer = SoftBasic.BytesArrayRemoveLast(b1, 4);

            // buffer 的值就是b1移除了后四个字节 new byte[] { 0x13, 0xA6, 0x15 };

            #endregion
        }
Esempio n. 3
0
        /// <summary>
        /// 接收到串口数据的时候触发
        /// </summary>
        /// <param name="sender">串口对象</param>
        /// <param name="e">消息</param>
        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            var sp = (SerialPort)sender;

            int rCount = 0;

            byte[] buffer  = new byte[1024];
            byte[] receive = null;

            while (true)
            {
                System.Threading.Thread.Sleep(20);
                int count = sp.Read(buffer, rCount, sp.BytesToRead);
                rCount += count;
                if (count == 0)
                {
                    break;
                }

                receive = new byte[rCount];
                Array.Copy(buffer, 0, receive, 0, count);
            }

            if (receive == null)
            {
                return;
            }
            byte[] modbusCore = SoftBasic.BytesArrayRemoveLast(receive, 2);
            byte[] SendData   = null;
            if (modbusCore[3] == 0x72)
            {
                // Read
                SendData = ReadSerialByCommand(modbusCore);
                RaiseDataReceived(SendData);
                serialPort.Write(SendData, 0, SendData.Length);
            }
            else if (modbusCore[3] == 0x77)
            {
                // Write
                SendData = WriteSerialByMessage(modbusCore);
                RaiseDataReceived(SendData);
                serialPort.Write(SendData, 0, SendData.Length);
            }
            else
            {
                serialPort.Close();
            }

            if (IsStarted)
            {
                RaiseDataSend(receive);
            }
        }
Esempio n. 4
0
        private void ProcessReceivedData(byte[] receive)
        {
            byte[] modbusCore = SoftBasic.BytesArrayRemoveLast(receive, 2);
            lock (LockObject)
            {
                var bufferMsgReceiver = string.Empty;

                if (receive == null || receive.Length < 1)
                {
                    ResponseReceived = true;
                }
                else
                {
                    bufferMsgReceiver = Encoding.UTF8.GetString(modbusCore, 0, modbusCore.Length);
                    byte[] copy = ReadFromModbusCore(modbusCore);

                    serialPort.Write(copy, 0, copy.Length);
                    if (IsStarted)
                    {
                        RaiseDataReceived(receive);
                    }
                }
            }
        }
Esempio n. 5
0
        /// <summary>
        /// 接收到串口数据的时候触发
        /// </summary>
        /// <param name="sender">串口对象</param>
        /// <param name="e">消息</param>
        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int rCount = 0;

            byte[] buffer  = new byte[1024];
            byte[] receive = null;

            while (true)
            {
                System.Threading.Thread.Sleep(20);              // 此处做个微小的延时,等待数据接收完成
                int count = serialPort.Read(buffer, rCount, serialPort.BytesToRead);
                rCount += count;
                if (count == 0)
                {
                    break;
                }

                receive = new byte[rCount];
                Array.Copy(buffer, 0, receive, 0, count);
            }

            if (receive == null)
            {
                return;
            }

            if (receive.Length < 3)
            {
                LogNet?.WriteError(ToString( ), $"Uknown Data:" + SoftBasic.ByteToHexString(receive, ' '));
                return;
            }

            if (Serial.SoftCRC16.CheckCRC16(receive))
            {
                byte[] modbusCore = SoftBasic.BytesArrayRemoveLast(receive, 2);

                if (!CheckModbusMessageLegal(modbusCore))
                {
                    // 指令长度验证错误,关闭网络连接
                    LogNet?.WriteError(ToString( ), $"Receive Nosense Modbus-rtu : " + SoftBasic.ByteToHexString(receive, ' '));
                    return;
                }

                // 验证站号是否一致
                if (station >= 0 && station != modbusCore[0])
                {
                    LogNet?.WriteError(ToString( ), $"Station not match Modbus-rtu : " + SoftBasic.ByteToHexString(receive, ' '));
                    return;
                }

                // LogNet?.WriteError( ToString( ), $"Success:" + BasicFramework.SoftBasic.ByteToHexString( receive, ' ' ) );
                // 需要回发消息
                byte[] copy = ModbusInfo.PackCommandToRtu(ReadFromModbusCore(modbusCore));

                serialPort.Write(copy, 0, copy.Length);

                if (IsStarted)
                {
                    RaiseDataReceived(receive);
                }
            }
            else
            {
                LogNet?.WriteWarn("CRC Check Failed : " + SoftBasic.ByteToHexString(receive, ' '));
            }
        }