Как я могу сохранить данные и отправлять их по серийному номеру?
Я хочу сделать массив с данными с датчика. В данных у меня есть смещение по осям 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();
}
@Trzywu, 👍0
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, заканчивающейся строкой.
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор