Как я могу сохранить данные и отправлять их по серийному номеру?
Я хочу сделать массив с данными с датчика. В данных у меня есть смещение по осям 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-команда не отвечает на последовательный монитор
Хорошо. Я понял. Мне просто нужен способ хранения данных и их отправки. Теперь у меня есть код для создания массива из 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