Цитата:
Сообщение от T_r_D
xmetal
Спасибо за пример сравнения.
По поводу данных.
Ведройд не сохраняет в себе ни каких значений, он тупо считает и выводит то, что на него приходит.
Ардуина кладёт в массив данные с интересующих меня ID, данные по шине идут естественно один пакет за раз, а мне иногда нужны данные из разных пакетов, так что дуина их складывает в массив, а потом все изменения выкидывает в порт.
Тоесть выдаёт всё за раз.
Вот что в итоге сотворил.
При каждом приходе интересующего меня ID данные складываются в массив и пишется флаг Compare = true;
Ну а дальше проверяется в основном цикле вышли ли 100мс и состояние флага.
И если вышли и флаг true, то сравниваются массивы и если не равны, то выдаём данные в порт и записываем данные из массива 1 в массив 2 (тоесть с тем, с которым в дальнейшем будем сравнивать).
PHP код:
if ((millis() - time0) > 100 && Compare){
arrcmp = memcmp(DATA,DATA2,161);
if (arrcmp != 0)
{
Serial.write(DATA, 161); //41 + 54 +64
memcpy(DATA2,DATA,161); //Присваиваем массиву DATA2 160 байт массива DATA
}
time0 = millis();
Compare = false;
}
Так по идеи должно работать ещё быстрее
|
Цитата:
Сообщение от T_r_D
xmetal Стоп- стоп!
У нас есть цикл, в нём есть определение приёма пакета и если приняли, то куча ифов.
На данный момент заменено на switch.
Задетектили приём пакета, пошли вниз по коду, если есть, то изменили что-то в массиве, если нет, то просто сделали пробежку сверху вниз, сравнили массивы и побежали на следующий круг.
В этом цикле как бы не может быть много пакетов.
Если приняли нужный нам пакет, то сравнив у нас естественно массивы не совпали и мы выдали весь пакет целиком в порт, не важно что записали всего один бит, передали всё равно 161 байт. Ну и в буферный масив перекинули данные основного массива чтоб потом сравнивать дальше.
Так что складывание данных только из одного пакета за цикл и сравнение тоже.
Сейчас оптимизировал это свитчем и сделал сравнение только если пришёл интересующий меня пакет. В порт лететь стало меньше. Проблема ушла с кашей.
То что не ловит переодически пакеты это уже где-то с железом косяк. Даже на минимальном скетче есть потери пакетов (просто когда пакеты в консоль выводятся). После пропайки TJA, укорочения хвоста витухи в машине стало полутчше,но всё равно теряет. Видимо вместо дисплея в разъём втыкать нужно чтоб лишних проводов и скруток не было.
На этой недели проверю.
|
Возможно глупости напишу. Но интересуюсь, т.к. сам хочу начать заниматься этой темой только для Ниссана Теаны !
- сообщения изначально фильтруются уже ?
- как часто опрашивается шина в секунду ? Судя по загруженности Ардуино, постоянно со скоростью шины ? Т.е. есть такие одинокие редкие сообщения, который нужно вылавливать с большой непрерывной скоростью опроса ?
-Нельзя фрагментами делать выборку ? Что например , номер трека как сообщение проскочил один раз и все ... пока не сменишь трек? Как часто повторяются такие данные ?
например, где-то в теории читал , что сообщение повторяется до тех пор пока ему не ответит устройство, которому оно предназначено. Или здесь что-то не так в этом плане ?