Transmit Data to pmu connection tester through networking


#121

Your array of bytes should be in whatever form your computer uses to store bytes. Please don’t load text data directly into your byte array. C# has many utilities that should make it fairly simple to read your file and convert your hexadecimal text data to a collection of byte arrays, and it has plenty of documentation that can be reached with a quick Google search.

Read a file line by line:
https://msdn.microsoft.com/en-us/library/aa287535(v=vs.71).aspx

Use String.Substring() to remove the old checksum:
https://msdn.microsoft.com/en-us/library/system.string.substring(v=vs.110).aspx

Convert a hex string to a byte array:

Hopefully those links can give you some ideas.

Thanks,
Stephen


#122

Sir,
I have constructed a code by using your given references but i can’t get output screen that show me calculated crc. This is my program :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Read_textfile
{
    class Program
    {
        static void Main(string[] args)
        {
            int counter = 0;
            string line;

            // Read the file and display it line by line.
            System.IO.StreamReader file =
               new System.IO.StreamReader("e:\\sample.txt");
            while ((line = file.ReadLine()) != null)
            {
                Console.WriteLine(line);
                counter++;
            }

            file.Close();

            // Suspend the screen.
            Console.ReadLine();}
            public static byte[] StrToByteArray(string line)
    {
        Dictionary<string, byte> hexindex = new Dictionary<string, byte>();
        for (int i = 0; i <= 255; i++)
            hexindex.Add(i.ToString("X2"), (byte)i);

        List<byte> hexres = new List<byte>();
        for (int i = 0; i < line.Length; i += 2)            
            hexres.Add(hexindex[line.Substring(i, 2)]);

        return hexres.ToArray();
        
            }
       
    /// <summary>Generates a 16-bit CRC-CCITT checksum.</summary>
    /// <remarks>
    /// This is a table based 16-bit CRC popular for modem protocols defined for use by the
    /// Consultative Committee on International Telegraphy and Telephony (CCITT) 
    /// </remarks>
    public sealed class CrcCCITT
    {
        #region [ Members ]

        // Constants
        private const ushort CrcSeed = 0xFFFF;

        // Fields
        private ushort crc; // The crc data checksum so far.

        #endregion

        #region [ Constructors ]

        /// <summary>
        /// Creates a new instance of the CrcCCITT class.
        /// The checksum starts off with a value of 0xFFFF.
        /// </summary>
        public CrcCCITT()
        {
            Reset();
        }

        #endregion

        #region [ Properties ]

        /// <summary>
        /// Returns the CRCCCITT data checksum computed so far.
        /// </summary>
        public ushort Value
        {
            get
            {
                return crc;
            }
            set
            {
                crc = value;
            }
        }

        #endregion

        #region [ Methods ]

        /// <summary>
        /// Resets the CRC-CCITT data checksum as if no update was ever called.
        /// </summary>
        public void Reset()
        {
            crc = CrcSeed;
        }

        /// <summary>
        /// Updates the checksum with the int bval.
        /// </summary>
        /// <param name="value">The <see cref="byte"/> value to use for the update.</param>
        public void Update(byte value)
        {
            crc = (ushort)((crc << 8) ^ CrcTable[((crc >> 8) ^ value) & 0xff]);
        }

        /// <summary>
        /// Updates the checksum with the bytes taken from the array.
        /// </summary>
        /// <param name="buffer">buffer an array of bytes</param>
        public void Update(byte[] hexres)
        {
            if ((object)hexres == null)
                throw new ArgumentNullException("hexres");

            Update(hexres, 0, hexres.Length);
        }

        /// <summary>
        /// Adds the byte array to the data checksum.
        /// </summary>
        /// <param name = "buffer">The buffer which contains the data</param>
        /// <param name = "offset">The offset in the buffer where the data starts</param>
        /// <param name = "count">The number of data bytes to update the CRC with.</param>
        public void Update(byte[] hexres, int offset, int count)
        {
            if ((object)hexres == null)
                throw new ArgumentNullException("hexres");

            if (count < 0)
                throw new ArgumentOutOfRangeException("count", "Count cannot be less than zero");

            if (offset < 0 || offset + count > hexres.Length)
                throw new ArgumentOutOfRangeException("offset");

            while (--count >= 0)
            {
                crc = (ushort)((crc << 8) ^ CrcTable[((crc >> 8) ^ hexres[offset++]) & 0xff]);
                Console.WriteLine(crc);
                Console.ReadLine();
            }
        }

        #endregion

        #region [ Static ]

        // Static Fields
        private readonly static ushort[] CrcTable = new ushort[]
        {
            0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
            0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
            0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
            0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
            0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
            0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
            0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
            0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
            0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
            0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
            0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 
            0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 
            0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 
            0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 
            0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
            0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 
            0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
            0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 
            0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
            0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
            0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
            0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
            0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
            0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
            0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
            0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
            0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
            0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
            0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
            0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
            0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
            0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
        };

        #endregion
    }
}
               
        
    }

Please help me and correct my program?
Thanks,
Owais


#123

Sir,
Please correct my code so that i can get crc bytes and then append to my frames?


#124

Here is a list of things you still need to do in order to see the calculated CRC.

  • Use Substring() to remove the old CRC from the end of the line.
  • Call StrToByteArray() so you can use the byte array in the CrcCCITT object.
  • Instantiate an object of type CrcCCITT and call the Update() method to pass in your byte array.
  • Get the result of the CRC via the Value property and write it out to the console, preferably in hex.

#125

sir,
My hex data in text file has no crc at the end of line.
My data in hex file upto rocof bytes.
This program looks complex so can you modify my program that i have send you earlier?


#126

No, I can’t. In this case, I can provide guidance, but not labor.


#127

Sir,
I want to export my output streams via network to another computer. I am initializing from one machine but i can’t get stream on second machine’s pmu connection tester.
In previous comments, Ritchie sir suggests me following changes as shown in picure

I have tested both wired and wireless network but same error occurs as i discussed in previous comment.

I have also tested with different port numbers. I am receiving stream on first machine but cannot get on second machine.
What can i do now to achieve my task?


#128

Try the following:

  • Double-check the firewall settings on the first machine. If you made the firewall change on the second machine but not the first machine, it will not work.
  • Initialize the output stream on the first machine.
  • Double-check that the IP address in the PMU Connection Tester matches the IP address of the first machine. If you are connecting to another machine, it will not work.
  • Double-check that the port in the PMU Connection Tester matches the port of the output stream that was set before the last time you initialized the output stream. If you are connecting to a port that the openPDC is not listening on, it will not work.

#129

Sir,
I have changed firewall settings on first as well as second machine. Above picture of firewall is of first machine.
I have inserted IP address of first machine into pmu connection tester of second machine. Above picture of pmu connection tester is of second machine in which IP address of first machine is inserted i.e 192.168.1.21
I have checked the port number. In above picture of pmu connection tester port number is 4712 and i have set 4712 as port number of output stream in first machine.


#130

Did you initialize the output stream?


#131

Yes sir i have initialized every time


#132

In the PMU Connection Tester, try changing the ForceIPv4 setting. Then connect again and see if anything changes.


#133

Sir, it works stream is receiving by second machine


#134

Sir,
My byte array is saved in variable ‘a’.
Can you guide me about update() method ?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Read_textfile
{
    class Program
    {
        static void Main(string[] args)
        {
            int counter = 0;
            string line;
            byte[] a;
            
            // Read the file and display it line by line.
            System.IO.StreamReader file =
               new System.IO.StreamReader("e:\\sample.txt");
            while ((line = file.ReadLine()) != null)
            {
                //Console.WriteLine(line);
                 a = StrToByteArray(line);
               

               // Console.WriteLine(a);
                
                counter++;
            }
            Console.ReadLine();
               //Console.WriteLine(a);
           // file.Close();
        }
       // public static byte[] StringToByteArrayFastest(string hex)
      //  {
            //if (hex.Length % 2 == 1)
              //  throw new Exception("The binary key cannot have an odd number of digits");

            //byte[] arr = new byte[hex.Length >> 1];

            //for (int i = 0; i < hex.Length >> 1; ++i)
            //{
              //  arr[i] = (byte)((GetHexVal(hex[i << 1]) << 4) + (GetHexVal(hex[(i << 1) + 1])));
            //}

            //return arr;
        //}

       // public static int GetHexVal(char hex)
        //{
          //  int val = (int)hex;
            //For uppercase A-F letters:
            //return val - (val < 58 ? 48 : 55);
            //For lowercase a-f letters:
            //return val - (val < 58 ? 48 : 87);
            //Or the two combined, but a bit slower:
            //return val - (val < 58 ? 48 : (val < 97 ? 55 : 87));
        //}
            // Suspend the screen.
          //  Console.ReadLine();
        
        public static byte[] StrToByteArray(string str)
        {
            Dictionary<string, byte> hexindex = new Dictionary<string, byte>();
            for (int i = 0; i <= 255; i++)
                hexindex.Add(i.ToString("X2"), (byte)i);

            List<byte> hexres = new List<byte>();
            for (int i = 0; i < str.Length; i += 2)
                hexres.Add(hexindex[str.Substring(i, 2)]);
          //  Console.WriteLine(hexres);
            return hexres.ToArray();
           //Console.WriteLine( byte hexres );

        }
       

        
        /// <summary>Generates a 16-bit CRC-CCITT checksum.</summary>
        /// <remarks>
        /// This is a table based 16-bit CRC popular for modem protocols defined for use by the
        /// Consultative Committee on International Telegraphy and Telephony (CCITT) 
        /// </remarks>
        public sealed class CrcCCITT
        {
            #region [ Members ]

            // Constants
            private const ushort CrcSeed = 0xFFFF;

            // Fields
           
          
            
            private ushort crc; // The crc data checksum so far.

            #endregion

            #region [ Constructors ]

            /// <summary>
            /// Creates a new instance of the CrcCCITT class.
            /// The checksum starts off with a value of 0xFFFF.
            /// </summary>
            public CrcCCITT()
            {
                Reset();
            }

            #endregion

            #region [ Properties ]

            /// <summary>
            /// Returns the CRCCCITT data checksum computed so far.
            /// </summary>
          
            public ushort Value
            {
                get
                {
                    return crc;
                }
                set
                {
                    crc = value;
                }
            }

            #endregion

            #region [ Methods ]

            /// <summary>
            /// Resets the CRC-CCITT data checksum as if no update was ever called.
            /// </summary>
            public void Reset()
            {
                crc = CrcSeed;
            }

            /// <summary>
            /// Updates the checksum with the int bval.
            /// </summary>
            /// <param name="value">The <see cref="byte"/> value to use for the update.</param>
            public void Update(byte value)
            {
                crc = (ushort)((crc << 8) ^ CrcTable[((crc >> 8) ^ value) & 0xff]);
            }

            /// <summary>
            /// Updates the checksum with the bytes taken from the array.
            /// </summary>
            /// <param name="buffer">buffer an array of bytes</param>
            
            public void Update(byte[] a)
            {
                if ((object)a == null)
                    throw new ArgumentNullException("buffer");

                Update(a, 0, a.Length);
                
            }

            /// <summary>
            /// Adds the byte array to the data checksum.
            /// </summary>
            /// <param name = "buffer">The buffer which contains the data</param>
            /// <param name = "offset">The offset in the buffer where the data starts</param>
            /// <param name = "count">The number of data bytes to update the CRC with.</param>
            public void Update(byte[] buffer, int offset, int count)
            {
                if ((object)buffer == null)
                    throw new ArgumentNullException("buffer");

                if (count < 0)
                    throw new ArgumentOutOfRangeException("count", "Count cannot be less than zero");

                if (offset < 0 || offset + count > buffer.Length)
                    throw new ArgumentOutOfRangeException("offset");

                while (--count >= 0)
                {
                    crc = (ushort)((crc << 8) ^ CrcTable[((crc >> 8) ^ buffer[offset++]) & 0xff]);
                   
                    
                }
                

                
            }

            

            #endregion

            #region [ Static ]

            // Static Fields
            private readonly static ushort[] CrcTable = new ushort[]
        {
            0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
            0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
            0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
            0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
            0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
            0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
            0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
            0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
            0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
            0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
            0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 
            0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 
            0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 
            0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 
            0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
            0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 
            0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
            0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 
            0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
            0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
            0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
            0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
            0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
            0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
            0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
            0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
            0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
            0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
            0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
            0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
            0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
            0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
        };
           
            #endregion
           
        }
        }
    }

#135

Here’s some sample code to use the CrcCCITT class.

// Initialize the byte array
byte[] bytes = ...;

// Create the CRC calculator
CrcCCITT calc = new CrcCCITT();

// Send bytes into the CRC calculator
calc.Update(bytes);

// Get the CRC value from the calculator
ushort crc = calc.Value;

#136

Sir,
I have written this :
byte[] bytes = a;
CrcCCITT calc = new CrcCCITT();
calc.Update(bytes);
ushort crc = calc.Value;

These error occurs in calc.Update(bytes) line


#137

Put the code inside your while loop, which is in the Main() method.


#138

Sir,
Code is running.
But ans is in decimal form.

how can i convert it in hex form?


#139

#140

Sir,
how can i copy crc bytes from console as i have to append them in my text file or there is any code to append?