コード例 #1
0
        public double ReadRegAscii(byte slaveAddress, long Address, int nTimeout = 1000)
        {
            Byte[] recvBytes = new Byte[1024];
            int    recvSize  = 0;

            byte[] CMD = new byte[17];
            CMD[0] = 0;
            string temp = (slaveAddress).ToString("X2");

            //站号
            CMD[1] = (byte)(slaveAddress).ToString("X2").ToCharArray()[0];
            CMD[2] = (byte)(slaveAddress).ToString("X2").ToCharArray()[1];
            //命令
            CMD[3] = (byte)'0';
            CMD[4] = (byte)'3';
            //地址
            byte addr = (byte)((Address & 0XFF00) >> 8);

            temp   = ((byte)((Address & 0XFF00) >> 4)).ToString("X2");
            CMD[5] = (byte)((byte)((Address & 0XFF00) >> 8)).ToString("X2").ToCharArray()[0];
            CMD[6] = (byte)((byte)((Address & 0XFF00) >> 8)).ToString("X2").ToCharArray()[1];
            temp   = ((byte)((Address & 0X00FF) >> 0)).ToString("X2");
            CMD[7] = (byte)((byte)((Address & 0X00FF) >> 0)).ToString("X2").ToCharArray()[0];
            CMD[8] = (byte)((byte)((Address & 0X00FF) >> 0)).ToString("X2").ToCharArray()[1];

            //读出个数
            CMD[9]  = (byte)'0';
            CMD[10] = (byte)'0';
            CMD[11] = (byte)'0';
            CMD[12] = (byte)'1';

            byte[] bytesAscii = new Byte[6];
            bytesAscii[0] = slaveAddress;
            bytesAscii[1] = 0x03;
            bytesAscii[2] = (byte)((Address & 0XFF00) >> 8);
            bytesAscii[3] = (byte)(Address & 0X00FF);
            bytesAscii[4] = 0x00;
            bytesAscii[5] = 0x01;

            int VALLRC = ParityType.LRC(bytesAscii, 6);

            temp    = ((byte)((VALLRC & 0XF0) >> 4)).ToString("X");
            CMD[13] = (byte)((byte)((VALLRC & 0XF0) >> 4)).ToString("X").ToCharArray()[0];
            CMD[14] = (byte)((byte)(VALLRC & 0X0F)).ToString("X").ToCharArray()[0];
            temp    = ((byte)((VALLRC & 0X0F) >> 0)).ToString("X");
            CMD[15] = 0X0D;
            CMD[16] = 0X0A;
            CMD[0]  = (byte)':';
            _serialPort.DiscardInBuffer();
            _serialPort.Write(CMD, 0, CMD.Length);
            int       data      = 0;
            string    result    = "";
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Restart();
            do
            {
                if (stopwatch.ElapsedMilliseconds > nTimeout)
                {
                    return(double.NaN);
                }
                try
                {
                    Byte d = (Byte)_serialPort.ReadByte();
                    recvBytes[recvSize++] = d;
                }
                catch (Exception ex)
                {
                    continue;
                }
                if (recvSize >= 5 && recvBytes[3] == (Byte)'8' && recvBytes[3] == (Byte)'3')
                {
                    return(double.NaN);
                }

                if (recvSize >= 15 && recvBytes[13] == 0x0D && recvBytes[14] == 0x0a)
                {
                    result = Encoding.Default.GetString(recvBytes);
                    result = result.Substring(7, 4);
                    data   = Convert.ToInt32(result, 16);
                    return(data);
                }
            }while (true);
        }