Как я могу сохранить данные и отправлять их по серийному номеру?

Я хочу сделать массив с данными с датчика. В данных у меня есть смещение по осям x/y. Я хочу отправить их в массиве, потому что в моем коде Python я не отправляю их по одному, это очень сильно замедляет программу.

Код Arduino, отвечающий за датчик

class MouseRptParser : public MouseReportParser
{
protected:
 void OnMouseMove (MOUSEINFO *mi);
};

void MouseRptParser::OnMouseMove(MOUSEINFO *mi)
{

    Serial.print(mi ->dX, DEC);
    Serial.print(",");
    Serial.println(mi ->dY, DEC);

};

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

class MouseRptParser : public MouseReportParser {

 void OnMouseMove (MOUSEINFO *mi); };

void MouseRptParser::OnMouseMove(MOUSEINFO *mi)
{ int i;   for (i=0;i<10;i+2)   {
        data[i]=(mi ->dX, DEC);
        data[i+1]=(mi ->dY, DEC);   } 
  Serial.println(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8],data[9]);

    delay(20); };

РЕДАКТИРОВАНИЕ: У меня есть программа, которая создает массив из 10 ячеек, но значения в нем постоянные и равны 10.

#include <hidboot.h>
#include <usbhub.h>

// Удовлетворяем IDE, которой также необходимо увидеть оператор include в ino.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>
int data[10];

class MouseRptParser : public MouseReportParser
{
protected:
 void OnMouseMove (MOUSEINFO *mi);
};

void MouseRptParser::OnMouseMove(MOUSEINFO *mi)
{

    for (int i=0; i<10; i=i+2)
  {
    data[i]=(mi->dX, DEC);
    data[i+1]=(mi->dY, DEC);

  }
  for(int j=0; j<10; j=j+1)
  {  
  Serial.print(data[j]);
  Serial.print(",");
}
Serial.println();
  delay(100);
};

USB     Usb;
USBHub     Hub(&Usb);
HIDBoot<USB_HID_PROTOCOL_MOUSE>    HidMouse(&Usb);

MouseRptParser Prs;

void setup()
{
    Serial.begin( 9600 );
#if !defined(__MIPSEL__)
    while (!Serial); // Ожидание подключения последовательного порта — используется на платах Leonardo, Teensy и других со встроенным последовательным подключением USB CDC
#endif
    //Serial.println("Старт");

    if (Usb.Init() == -1)
        Serial.println("OSC did not start.");




    HidMouse.SetReportParser(0, &Prs);
}

void loop()
{


  Usb.Task();

}

, 👍0


1 ответ


Лучший ответ:

1

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

Вы сами решаете, что составляет один «блок» данных.

Нет абсолютно никакой разницы (кроме небольших накладных расходов на обработку) между:

Serial.print("Hello");
Serial.print(" ");
Serial.println("World");

и:

Serial.println("Hello World");

Оба они приводят к последовательной отправке:

H
e
l
l
o
[space]
W
o
r
l
d
[cr]
[lf]

Неважно, как вы «компонуете» вещи (или попытаетесь это сделать), это не имеет значения.

Вам необходимо иметь:

  • Некоторый способ определения начала блока данных,
  • Механизм для получения всего блока по одному байту за раз, и
  • Некоторый способ определения конца блока данных.

Как вы это сделаете, зависит только от вас.


Вот пример того, как организовать хранение:

class MouseRptParser : public MouseReportParser
{
    private:
        int dx[10];
        int dy[10];
        int dpos = 0;

    protected:
        void OnMouseMove (MOUSEINFO *mi) {
            dx[dpos] = mi->dX;
            dy[dpos] = mi->dY;
            dpos++;

            if (dpos == 10) {
                dpos = 0;
                for (int i = 0; i < 10; i++) {
                    Serial.print("X");
                    Serial.print(dx[i]);
                    Serial.print("Y");
                    Serial.print(dy[i]);
                }
                Serial.println();
            }
        }
};

Это дает вам пару массивов из 10 записей, один для значений X и один для значений Y. Каждый раз, когда приходит отчет, сохраняются текущие значения DX и DY. Указатель на место сохранения увеличивается. Затем, если этот указатель равен 10, сбрасываем его на 0 и печатаем все значения.

Я выбрал формат, который дает вам:

X3Y-2X2Y-4X6Y8X-3Y7X6Y38X176Y76X-4Y8X8Y3X39Y-32X71Y4

То есть «X», за которым следует десятичное значение для изменения X, и Y, за которым следует десятичное значение для изменения Y. Затем весь лот завершается стандартной парой символов CR/LF, заканчивающейся строкой.

,

Хорошо. Я понял. Мне просто нужен способ хранения данных и их отправки. Теперь у меня есть код для создания массива из 10 элементов и отправки их в цикле, но он отправляет постоянное значение. Проверьте мой пост редактирования., @Trzywu

@Trzywu Я не думаю, что вы четко представляете себе, чего именно вы пытаетесь добиться. В данный момент вы берете координаты X/Y и сохраняете их по 5 раз в массиве: x,y,x,y,x,y,x,y,x,y. Затем вы их печатаете. Что вы *на самом деле* хотите сделать? Какие данные *вы* хотите сохранить? *Когда* вы хотите отправить эти данные на ПК?, @Majenko

Я хочу отправить данные в таком формате, как x1,y1,x2,y2 и так далее в x5,yy или x10,y10. Я хочу, чтобы они отправляли с некоторой задержкой, я выясню точное число, когда получу эту часть данных., @Trzywu

Итак, вы хотите сохранить 5 пар координат, и только когда вы соберете 5 пар, вы хотите отправить их на ПК. Поэтому вам нужно иметь некоторое представление о том, сколько пар вы получили, и сохранять только *текущую* пару в *текущих* слотах массива. Только когда массив заполнен, вы делаете что-либо с Serial., @Majenko

Пожалуйста, можете ли вы быть более конкретными? Я резервирую память в этой строке "int data[10];" и сохраняю для соответствующей ячейки здесь " for (int i=0; i<10; i=i+2) { данные[i]=(mi->dX, DEC); данные[i+1]=(mi->dY, DEC); }" Или я что-то упускаю?, @Trzywu

Вы сохраняете в *каждой* ячейке от 0 до 10. Вам *не* нужен цикл for там. Вам просто нужна некая переменная, которая укажет, где в массиве вы *сейчас* находитесь, и увеличит ее только один раз для каждого полученного отчета. Только когда массив заполнен (current == max), вы печатаете содержимое и сбрасываете указатель "current" на начало массива., @Majenko

@Trzywu Я добавил пример к своему ответу., @Majenko

Спасибо, я ночевал. Я изменил кое-какой код, чтобы указать определенный символ для разделения. Еще раз большое спасибо., @Trzywu