JeezyWonder Ответов: 1

(C#) как сделать так, чтобы hexdump работал с последовательным портом?


Привет,
Я получаю данные в формате. hex через UART в текстовое поле, я получил их в формате stardart:
Что я получаю сейчас[^]
Но мне нужно, чтобы он был показан в формате HexDump, я нашел пример в COdeProject
Быстрая и грязная создать шестнадцатеричное представление массива байтов[^]
И попробовал сам, ничего не случилось, кажется, я использую его неправильно, пожалуйста, помогите, я действительно сейчас борюсь

Что я уже пробовал:

         using System;
           using System.Collections.Generic;
            using System.ComponentModel;
           using System.Data;
                using System.Drawing;
            using System.Linq;
           using System.Text;
             using System.Threading.Tasks;
            using System.Windows.Forms;
           using System.IO.Ports;
           namespace WindowsFormsApplication8
         {
              public partial class Form1 : Form
              {
          public Form1()
          {
             InitializeComponent();
           }

        private void button1_Click(object sender, EventArgs e)   // Here i send a byte to MK
        {

            //  serialPort1.RtsEnable = true; serialPort1.DtrEnable = true;
            //  var content = new List<byte>();
            // content.AddRange(Encoding.ASCII.GetBytes("1"));
            //  content.Add(3); // ASCII ETX
            //byte[] buffer = content.ToArray();
            // serialPort1.Write(buffer, 0, buffer.Length);


            //byte[] MyMessage = System.Text.Encoding.UTF8.GetBytes("2");
            //serialPort1.Write(MyMessage, 0, MyMessage.Length);

            serialPort1.Write("\u0005");
            serialPort1.Write(Convert.ToString(0x05));


        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)  // choosing a right com port
        {
            serialPort1.PortName = textBox1.Text;
            serialPort1.BaudRate = Convert.ToInt32(textBox2.Text);

        }
       string rs;
        byte re;
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) // Da
        {
            try
            {
                //rs = serialPort1.ReadByte();
                //re = Convert.ToByte(serialPort1.ReadByte());
                rs = serialPort1.ReadExisting();
               System.Text.Encoding.ASCII.GetString(new[] { re });
                this.Invoke(new EventHandler(type));

            }
            catch (System.TimeoutException) { }
        }
        void type(object s,EventArgs e)              // receive data
        {

             textBox4.Text += rs;
            

        }

        private void button3_Click(object sender, EventArgs e)   // OPen port
        {
            serialPort1.Open();
        }

        private void button4_Click(object sender, EventArgs e)  // Close port
        {
            serialPort1.Close();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            serialPort1.Write(Convert.ToString(0x02));
        }

        private void textBox4_TextChanged(object sender, EventArgs e)
        {

        }
    }
    class Utils
    {
        public static string HexDump(byte[] bytes, int bytesPerLine = 16)
        {
            if (bytes == null) return "<null>";
            int bytesLength = bytes.Length;

            char[] HexChars = "0123456789ABCDEF".ToCharArray();

            int firstHexColumn =
                  8                   // 8 characters for the address
                + 3;                  // 3 spaces

            int firstCharColumn = firstHexColumn
                + bytesPerLine * 3       // - 2 digit for the hexadecimal value and 1 space
                + (bytesPerLine - 1) / 8 // - 1 extra space every 8 characters from the 9th
                + 2;                  // 2 spaces 

            int lineLength = firstCharColumn
                + bytesPerLine           // - characters to show the ascii value
                + Environment.NewLine.Length; // Carriage return and line feed (should normally be 2)

            char[] line = (new String(' ', lineLength - Environment.NewLine.Length) + Environment.NewLine).ToCharArray();
            int expectedLines = (bytesLength + bytesPerLine - 1) / bytesPerLine;
            StringBuilder result = new StringBuilder(expectedLines * lineLength);

            for (int i = 0; i < bytesLength; i += bytesPerLine)
            {
                line[0] = HexChars[(i >> 28) & 0xF];
                line[1] = HexChars[(i >> 24) & 0xF];
                line[2] = HexChars[(i >> 20) & 0xF];
                line[3] = HexChars[(i >> 16) & 0xF];
                line[4] = HexChars[(i >> 12) & 0xF];
                line[5] = HexChars[(i >> 8) & 0xF];
                line[6] = HexChars[(i >> 4) & 0xF];
                line[7] = HexChars[(i >> 0) & 0xF];

                int hexColumn = firstHexColumn;
                int charColumn = firstCharColumn;

                for (int j = 0; j < bytesPerLine; j++)
                {
                    if (j > 0 && (j & 7) == 0) hexColumn++;
                    if (i + j >= bytesLength)
                    {
                        line[hexColumn] = ' ';
                        line[hexColumn + 1] = ' ';
                        line[charColumn] = ' ';
                    }
                    else
                    {
                        byte b = bytes[i + j];
                        line[hexColumn] = HexChars[(b >> 4) & 0xF];
                        line[hexColumn + 1] = HexChars[b & 0xF];
                        line[charColumn] = (b < 32 ? '·' : (char)b);
                    }
                    hexColumn += 3;
                    charColumn++;
                }
                result.Append(line);
            }
            return result.ToString();
        }
    }
}

Ralf Meier

Я не совсем понимаю, что ты там делаешь ...
Вы получаете какие-то данные, и они не преобразуются должным образом ?
Или вы не получаете никаких данных из сериального порта ?
В данный момент для меня не имеет смысла то, что вы пишете в SerialPort внутри Button1_Click-метода.

Возможно, вы объясните немного больше ...

JeezyWonder

Извините за missunderstadings, пожалуйста, не смотрите на метод кнопок, я использую их для других команд, я получаю данные сразу же с моего микроконтроллера(код для него уже написан мной в AVR compile, поэтому, когда я включаю свою windows form и coonnect uart с ПК на mk, я получаю данные в шестнадцатеричном формате из eeprom mk), и эти данные будут показаны на textBox4, но они будут отправлены способом stardart( см. рисунок). Но я хочу, чтобы он отображался в виде HexDump, colums(см. ссылку), а не строк. спасибо

Ralf Meier

Извиняюсь... Я неправильно понял ваш вопрос ... :(
Когда я смотрю на ваш serialPort1_DataReceived-метод, вы не используете HexDump-метод из своего кода.
Я предлагаю вам использовать это вместо конвертера System.Text.Encoding.ASCII.GetString (который работает так, как вы видите ...)

1 Ответов

Рейтинг:
1

CPallini

На самом деле, если Utils.HexDump метод правильно выполняет свою работу (я пробовал его со случайными данными).
Однако в коде, который вы опубликовали, я не вижу, как вы его используете.


JeezyWonder

да, я знаю, я не знаю, как им пользоваться(
у меня есть textbox4, где я хочу его отобразить

CPallini

Просто соберите данные, поступающие из последовательной линии, вызовите метод Hexdump и затем отобразите результат в текстовом поле. вам нужно сделать его многострочным, см., например:
https://msdn.microsoft.com/en-us/library/a5hcydxx(v=против 110). aspx