C# - требуется помощь в кодировании SerialPort - PullRequest
2 голосов
/ 05 февраля 2020

Мне нужна помощь с моей программой, с которой я хочу читать коды из нескольких микроконтроллеров одновременно и переводить их в простой текст. Существует только один последовательный интерфейс, где собраны все коды. Перевод кодов работает, но у меня проблема в том, что коды не читаются правильно. Он делает паузы снова и снова там, где нет пропусков и где есть пропуски (500 micro se c.) Он не всегда распознает их правильно.

Вот часть кода:

public byte[] block = new byte[4096];
        public int posBlock = 0;

        public void Read(object sender, SerialDataReceivedEventArgs e)
        {
            console_.WriteLine("--------------------------------------------------");
            console_.WriteLine("Void: Read(object sender, SerialDataReceivedEventArgs e)");
            int offset = 0, count = serialPort.BytesToRead, i = 0;
            byte[] rd = new byte[count];

            serialPort.Read(rd, offset, count);

            for (int buffer = 0; buffer < count; buffer++) { block[posBlock + buffer] = rd[buffer]; i = buffer; }
            i++;
            posBlock += i;
            string rcpausgabe = null;
            for (int i2 = 0; i2 < posBlock; i2++) { rcpausgabe += " " + (int)(block[i2]); }
            //WriteProtocol(global_.variables.protocol_other, rcpausgabe, true);
            console_.WriteLine("ReadCode: " + rcpausgabe);
            if (IsDecode == false) { Zersetzten(); } else { console_.WriteLine("Add but not Zersetzen()"); }
            IsDecode = false;
            console_.WriteLine("--------------------------------------------------");
        }

        bool IsDecode = true;
        public int ib = 0;
        public string bs = null;

        private void Zersetzten()
        {
            IsDecode = true;
            console_.WriteLine("--------------------------------------------------");
            console_.WriteLine("Void: Zersetzten()");

            byte[] b = new byte[4096];

            while (!(ib >= posBlock))
            {
                for (int i7 = 0; i7 < b[1] + 3; i7++)
                {
                    string rcpausgabe1 = null;
                    b[i7] = block[ib];
                    ib++;;
                    if (i7+1 == (b[1] + 3))
                    {
                        Thread.Sleep(500);
                        console_.WriteLine("Decoding b");
                        for (int i2 = 0; i2 < b[1]+3; i2++) { rcpausgabe1 += " " + (int)(b[i2]); }
                        console_.WriteLine("Decoding Code: " + rcpausgabe1);
                        bs = rcpausgabe1;                        
                        Decoding(b);
                    }                    
                }
            }
            IsDecode = false;
            block = new byte[4096];
            posBlock = 0;
            ib = posBlock;
            console_.WriteLine("--------------------------------------------------");
        }

Я запрограммировал свою собственную консоль (console_), чтобы помочь мне с этим, что позволяет мне отслеживать все процессы в режиме реального времени.

Я также благодарю всех за их ответы заранее.

(я перевел этот текст с переводчиком Pons, потому что мой английский sh не так хорош)

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Я не уверен, что с вами не так в отношении предоставленного вами кода.

Однако вы можете обратиться к [C#, для получения данных требуется микроконтроллер . от микроконтроллера)

, чтобы узнать, как получить данные из микроконтроллера.

0 голосов
/ 05 февраля 2020

Я не могу комментировать, поэтому я должен использовать сообщение, чтобы помочь вам уточнить ваш вопрос. Я отредактирую свой ответ, если бы вы могли предоставить более подробную информацию.

  1. Уточните свой вопрос.

    Какой результат вы ожидаете и какие явления вы наблюдаете.

  2. Сделать минимальным, воспроизводимым примером

    Очевидно, Read(object sender, SerialDataReceivedEventArgs e) не вызывается внутри вашего сообщения.

    Пока ваша проблема с чтением "приостановлена", то какой фрагмент кода вызывает Read, может оказаться необходимым.

  3. Что такое "пауза" и что " Gap ".

    Он делает паузы снова и снова там, где нет пробелов и там, где есть пробелы (500 micro se c.

    Я мог только догадываться о вашем Программа будет "останавливаться", когда есть разрыв, но не имея представления о том, что такое "разрыв" и "пауза".

  4. Что хотят достичь for (int i7 = 0; i7 < b[1] + 3; i7++) и for (int i2 = 0; i2 < b[1]+3; i2++) ?

    Вы используете b [1] для индексации, а b [1] изменяется при получении данных.

Редактирование: добавление Как создать Минимальный, воспроизводимый пример. Edit2: укажите странный кусок кода для l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...