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

Я хочу сделать массив с данными с датчика. В данных у меня есть смещение по осям 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, заканчивающейся строкой.

,