Преобразование и обновление непрерывной связи через последовательный порт из Arduino в целочисленный массив в Visual Studios (C #) - PullRequest
0 голосов
/ 03 сентября 2018

В настоящее время я читаю данные, поступающие непрерывно с датчика i2c, подключенного к Arduino, и успешно собираю данные в Visual Studios. Датчик получает 4 различных значения X, Y и затем отправляет их через Serial.Print в формате:

X1, Y1, X2, Y2, X3, Y3, X4, Y4 (где X1 - X4 и Y1 - Y4 - это значения в диапазоне от 0 до 1023, т. Е. 1023,1023,1023,1023,1023,1023,1023 , 1023), за которой следует команда Serial.println (""). Весь этот процесс повторяется непрерывно до выключения. Код Arduino:

for (i=0;i<16;i++) { data_buf[i]=0; }
    i=0;
      while(Wire.available() && i < 16) {
        data_buf[i] = Wire.read();
        i++;
      }

     Ix[0] = data_buf[1];
     Iy[0] = data_buf[2];
     s = data_buf[3];
     //Ix[0] += (s & 0x30) <<4;
     Ix[0] = data_buf[1] | ((data_buf[3] >> 4) & 0x03) << 8;
     Iy[0] = data_buf[2] | ((data_buf[3] >> 6) & 0x03) << 8;
     //Ix[0] = Ix[0] / test;

     Ix[1] = data_buf[4];
     Iy[1] = data_buf[5];
     s = data_buf[6];
     Ix[1] += (s & 0x30) <<4;
     Iy[1] += (s & 0xC0) <<2;

     Ix[2] = data_buf[7];
     Iy[2] = data_buf[8];
     s = data_buf[9];
     Ix[2] += (s & 0x30) <<4;
     Iy[2] += (s & 0xC0) <<2;

     Ix[3] = data_buf[10];
     Iy[3] = data_buf[11];
     s = data_buf[12];
     Ix[3] += (s & 0x30) <<4;
     Iy[3] += (s & 0xC0) <<2;

      for(i=0; i<4; i++)
{
if (Ix[i] < 1000)
Serial.print("");
if (Ix[i] < 100)
Serial.print("");
if (Ix[i] < 10)
Serial.print("");
    Serial.print( int(Ix[i]) );
Serial.print(",");
if (Iy[i] < 1000)
Serial.print("");
if (Iy[i] < 100)
Serial.print("");
if (Iy[i] < 10)
Serial.print("");
Serial.print( int(Iy[i]) );
if (i<3)
Serial.print(",");
}


Serial.println("");
delay(15);
}

У меня проблемы с преобразованием этих значений из Visual Studios, чтобы я мог передавать данные в виде отдельных целочисленных значений. Что у меня сейчас:

void _spManager_NewSerialDataRecieved(object sender, SerialDataEventArgs e)
        {
            if (this.InvokeRequired)
            {
                // Using this.Invoke causes deadlock when closing serial port, and BeginInvoke is good                      practice anyway.
                this.BeginInvoke(new EventHandler<SerialDataEventArgs>(_spManager_NewSerialDataRecieved), new object[] { sender, e });
                return;
            }

            int maxTextLength = 1000; // maximum text length in text box
            if (tbData.TextLength > maxTextLength)
                tbData.Text = tbData.Text.Remove(0, tbData.TextLength - maxTextLength);

            // This application is connected to a Arduino sending ASCCI characters, so data is converted                to text
            string Rawstr = Encoding.ASCII.GetString(e.Data);

            //Get values that are between the ',' from e.Data and store them in our new array
            string[] str = Rawstr.Split(',');

            //Convert str array into new int[] array (or similar) I've tried multiple things with no success
              ??????
             //This results in a "Input string was not in a correct format" error.
            int xx = Convert.ToInt32(str[0]);

            tbData.AppendText(Rawstr);
            tbData.ScrollToCaret();

        }

Вот где я сейчас застрял. Я полагаю, что у меня есть проблема, когда в строку [] str входит большое количество значений, потому что у меня нет ограничения на нее до того, как она начнет вводить новые значения в / и заменять уже существующие строковые значения.

Любое руководство приветствуется.

1 Ответ

0 голосов
/ 03 сентября 2018

Вы можете использовать Linq.
Сначала разделите на ,, пропустите пустые и пробельные символы, затем обрежьте первый символ (X или Y) и преобразуйте оставшуюся часть в целое число.

String Rawstr = "x1,y1,x2,y2," + Environment.NewLine;
Int32[] integers = Rawstr.Split(new [] { ',' }, StringSplitOptions.None).Where(s => !String.IsNullOrWhiteSpace(s)).Select(s => Convert.ToInt32(s.Substring(1))).ToArray();

Для "x1,y1,x2,y2," вы получаете целочисленный массив, содержащий [1,1,2,2].

...