Как вы Serial.Write () целочисленное значение вместо значения ASCII этого Int в C # - PullRequest
0 голосов
/ 15 мая 2019

Я разрабатываю служебную программу на C # для настройки параметров Arduino Mega, используемого в качестве контроллера мотора для 3 двигателей. Данные должны быть получены контроллером двигателя, например. [D2100] [= начальный байт, D = параметр для изменения, 2 = множитель 256 (0-3), 100 = остаток, добавленный к результату умножения (0-255), который должен остаться <1024, ] = конец байта. Числовые значения передаются как десятичное значение ASCII (48-51). </p>

Я попытался отправить в виде строки через Serial.write, который работает при запросе данных от контроллера, так как я могу заполнить текущие поля. Я отправил измененные значения в виде байтов за байтом из массива байтов, использовал convert.ToInt32, но кажется, что я могу отправлять только десятичные значения ASCII, которые я подтвердил в последовательном окне IDE Arduino с помощью serial.print значения полей. Прошло только программирование баз данных на C еще в 1990-х годах, прошу прощения за мое невежество, я только учусь. Ниже моя последняя версия отправляется в виде строки, но при создании массива байтов использовалась отрубленная версия публичного bool ExCmd (string cmd), а затем закомментировали разделы для строки. Пытаясь разобраться в течение двух недель, читая и кодируя, но не решаясь, любая помощь будет принята с благодарностью.

private void SlKp_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {

            if (!initLoad)
            {
                string cmdChar = "";
                int val = Convert.ToInt32(slKp.Value);
                if (enaMotor == 1)
                {
                    cmdChar = "D";
                }
                if (enaMotor == 2)
                {
                    cmdChar = "E";
                }
                if (enaMotor == 3)
                {
                    cmdChar = "F";
                }
                string val1 = Convert.ToString(val / 256);
                string val2 = Convert.ToString(val % 256);
                string cmd = '['+ cmdChar + val1 + val2 +']' ;
                if (spHandler.ExCmd(cmd))
                {
                    fieldChanged = true;
                    btSave.IsEnabled = true;
                }
            }

        }
   public bool ExCmd(string cmd)
        {
            try
            {
                if (_serialPort != null && _serialPort.IsOpen)
                {
                    _serialPort.DiscardOutBuffer();
                    _serialPort.DiscardInBuffer();
                    _receiveNow.Reset();

                    /*int intCount = 0;
                    int intChar = cmd[intCount];
                    if (intChar == 0b1011011)  //91 [ bracket is start byte
                    {                      
                        do
                        {*/
                            _serialPort.Write(cmd); //intCount,1);
                         /*   if (cmd[intCount] != 0b1011101)
                            {
                                intCount++;
                            }

                        } while (cmd[intCount] != 0b1011101 && intCount < 4); //93 ] backet is end byte
                        if(cmd[intCount] == 0b1011101)
                        {*/
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }/*
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }*/
            catch
            {
                return false;
            }
        }

Arduino Code

       case 'D':
#ifdef MOTOR_1           
            Mtr1.lKp_x100=(RxBuffer[1]*256)+RxBuffer[2];
#endif

1 Ответ

0 голосов
/ 15 мая 2019

Потерять Convert.ToString() звонки и просто разыграть.Если вы преобразуете в char, вы можете продолжать использовать код конкатенации строк, но последовательный порт все еще может неправильно его интерпретировать.

Что вам действительно нужно при работе с двоичными данными, так это байтовый массив.Это собственная структура данных, которую последовательный порт читает и записывает.Все вспомогательные функции для строк предполагают Unicode с определенной кодировкой, которая имеет значение только для текста.


Также хорошо подружиться с побитовыми операциями, если вы собираетесь делать двоичную связь.Например, (val / 256) сделает расширение знака, если число отрицательное, что испортит ваш поток данных.То, что вы хотите, это (byte)(val >> 8).

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