![]() |
Вот, навоял. Реагирует на изменения двух байт
void can() { if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) { if (canMsg.can_id == 0x32A) { if (canMsg.data[1] == 0x02 && canMsg.data[2] == 0x10) { Serial.println("Press Vol Up"); digitalWrite(vol_up, HIGH); } else{ Serial.println("Unpress Vol Up"); digitalWrite(vol_up, LOW); } if (canMsg.data[1] == 0x03 && canMsg.data[2] == 0x20) { Serial.println("Press Vol Down"); digitalWrite(vol_down, HIGH); } else{ Serial.println("Unpress Vol Down"); digitalWrite(vol_down, LOW); } } } } На = в дате ругалась, пока не написал ==. И при id = 32A отключало порты от любого сообщения в шине. А если id==32A, то отключает от сообщения с id 32A и датой отличной от прописанной на порты. Правильно вроде получилось написать ? |
Да, всё ок.
Яж с телефона пишу, синтаксис не особо проверяю, просто общий смысл доношу. Да и Arduino IDE не запускал 100 лет. Я STM32 в СubeMx и IAR пилю. И ни чего ни кто не отключает. :) Сообщение если пришло, то оно хранится в буфере. А вот что с ним делать решать тебе. Ты задал условие что если id отличается от 0х32А, то внутрь условия не заходить, а внутри этого условия ещё условия которые проверяют содержимое пришедшего пакета. PS. Кстати из за того, что в Ардуино нельзя задать нормальные фильтры аппаратные на CAN, то бедной атмеге с 12 мегагерцами приходится жрать всё то, что валится из CAN и переваривать это. Черевато пропусками пакетов. И я даже скажу с уверенностью и проверкой опытным путём что они пропадают! У меня в машине до сих пор Ардуино трудится, уже лет 5 наверное... Ни как на stm не поменяю. И очень короткие нажатия на кнопки она теряет... |
Ещё раз спасибо за помощь, завтра в машине уже проверю. STM понравился, делал как то диктофон на нём. Не дорогой, запустилось с первого тычка, отлично работает. Но я больше "паяльщик" и ремонтник, в программах - в ардуино чужой скетч мозгов не хватило поправить. Открыл похожий проект на STM, посмотреть на предмет поправить под себя, посмотрел и закрыл...
|
Ну не знаю...
Для стм и обвес проще, всего одна микруха трансиверы и если в фильтры не лезть, то только тайминги для can посчитать правильно в кубе... А вот в коде будет примерно тоже количество строк, но процедура будет вызываться только по приходу пакета. А если настроить фильтры аппаратные, так вообще красота. Но если скорость не нужна и нужна простота кода и доступность библиотек разных, то тут Ардуино более подходит... А если есть силы и желание разобраться, то СТМ окупит затраты с лихвой. |
Цитата:
Но у меня скорее всего проблемка из за функции "delay", "рубит" работу контроллера, и естественно теряет данные, которые продолжают течь по com. |
Да такой же как и на этой странице выше.
Делеев нету и в коде их быть не должно! Совсем не должно! Нужно пользоваться таймером. |
Цитата:
|
По слову millis ищи примеры.
Но если в шине идёт активный обмен пакетами, то даже избавление от делея не до конца спасёт. Ну не способна ардуина на 12 мегагерцах выступать программным фильтром да ещё и что-то делать при этом. Если конечно код включает только слежение за кнопками, то может и нормально будет... |
Функция Millis решила вопрос, данные стабильно считываются, все ок)
Пишут есть ещё лучше библиотеки https://smartmodules.ru/timerone-arduino, что меньше кода-это факт, а на сколько лучше...надо тестить. |
Ни на сколько.
Просто удобнее. Но если там есть хоть какие глюки, то они будут и у тебя в проекте. И за все удобства придётся платить скоростью и памятью. Да и можно вообще без библиотек всяких просто читая параметры регистров таймера атмеги. В общем этим библиотеки и занимаются... |
Часовой пояс GMT +4, время: 10:05. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot