Форум ModelldepO  

Вернуться   Форум ModelldepO > Моделизм > Электрика и DCC
Электрика и DCC Обсуждение цифрового и аналогового управления

Ответ
 
Опции темы Опции просмотра
Старый 14.08.2017, 23:57   #151
Alexandro
Заглянувший
 
Аватар для Alexandro
 
Регистрация: 07.09.2015
Адрес: SPb
Сообщений: 76
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 8
Поблагодарили 6 раз(а) в 6 сообщениях
Репутация: пока неопределено (6)
По умолчанию

Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
CH340 - работают нормально.
и с ним тоже были приключения ( похоже происходит когда у ардуины нет отдельного питания ).

посмотрел монитором данные которые отправляются - какой-то бред - Serial.print("packet; ");
Serial.println(packet); packet;
ZZ
packet;
XX
packet;
VV
packet;
UU
packet;
SS
packet;
RR
packet;
QQ
случайный пример из монитора.

может вместо пакета как-то массив можно создать ? по ссылкам - темный лес для меня(
Alexandro вне форума   Вверх
Старый 15.08.2017, 00:01   #152
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
По умолчанию

Цитата:
Сообщение от Alexandro Посмотреть сообщение
я делал простейший но рабочий вариант с передачей нажатия кнопки - он работал,но там просто переменная отправлялась Wire.beginTransmission(8);
тут видна попытка отправить массив, но не до конца. Вот так будет можно отправить пакет переменной длинны:
Код:
void sendPacket(int address, char *packet, int len) 
{ 
  Wire.beginTransmission(address); // transmit to device 
  Wire.write(packet, len);      
  Wire.endTransmission();   
}
А так будет выглядеть отправка текущего пакета из двух байт:
Код:
    ...
    sendPacket(11, packet, sizeof(packet)); 
    ...
shalex вне форума   Вверх
Пользователь сказал cпасибо:
Старый 15.08.2017, 00:17   #153
Alexandro
Заглянувший
 
Аватар для Alexandro
 
Регистрация: 07.09.2015
Адрес: SPb
Сообщений: 76
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 8
Поблагодарили 6 раз(а) в 6 сообщениях
Репутация: пока неопределено (6)
По умолчанию

Цитата:
Сообщение от shalex Посмотреть сообщение
тут видна попытка отправить массив, но не до конца. Вот так будет можно отправить пакет переменной длинны:
заработало!спс!!!
если я буду добавлять комманды в пакет - по этому же принципу - номер комманды и саму комманду ? ( скажем 11,dierection )
Alexandro вне форума   Вверх
Старый 15.08.2017, 00:34   #154
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
Плохо

Цитата:
Сообщение от Alexandro Посмотреть сообщение
заработало!спс!!!
Для этого есть специальная кнопка

Цитата:
Сообщение от Alexandro Посмотреть сообщение
если я буду добавлять комманды в пакет - по этому же принципу - номер комманды и саму комманду ? ( скажем 11,dierection )
Вроде того. Номер команды - это и есть команда, а точнее ее код. Далее обычно идут аргументы, которая требует формат команды (1-2-3 штуки). Аргументов может быть сколько угодно, главное, чтобы передатчик и приемник знали об этом числе аргументом для каждой команды. Или как вариант, передавать кол-во аргументов после кода команды, только нужное кол-во, например, только те, которые нужно поменять. Это немного уменьшит нагрузку на канал связи, но придется немного дописать "приемник".

Чтобы было куда добавлять аргументы, увеличим массив packet, чтобы можно было отправлять 1 команду и 9 ее аргументов максимально:
Код:
char packet[10];
и помнить, что надо менять параметр len при вызове ф-ии sendPacket на нужное кол-во байт/символов в пакете, чтобы не отправить "мусор" из "раздутого" массива.
shalex вне форума   Вверх
Старый 15.08.2017, 01:12   #155
BNSF9399
Местный
 
Аватар для BNSF9399
 
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
По умолчанию

Цитата:
Сообщение от shalex Посмотреть сообщение
sendPacket(11, packet, sizeof(packet));
Коллега, если мы так будем в лоб все говорить, камрад так и будет ждать готовый вариант
Я дал направление изучения, и даже пальцем ткнул в нужно место...

---------- Сообщение добавлено в 01:12 ---------- Предыдущие сообщение было в 01:04 ----------

Цитата:
Сообщение от shalex Посмотреть сообщение
Arduino код:
void sendPacket(int addresschar *packetint len

  
Wire.beginTransmission(address); // transmit to device 
  
Wire.write(packetlen);      
  
Wire.endTransmission();   

к слову, я бы сделал не так
Arduino код:
void sendPacket(int addresschar *packet

  
Wire.beginTransmission(address); // transmit to device 
  
Wire.write(packetsizeof(packet));      
  
Wire.endTransmission();   

а отправку оставил как есть.
Arduino код:
sendPacket(11packet); 
BNSF9399 вне форума   Вверх
Старый 15.08.2017, 09:53   #156
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
По умолчанию

Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
к слову, я бы сделал не так
Да, в частном случае сработает, но как только появятся команды длиннее 2-х байт, то ожидают проблемы.

---------- Сообщение добавлено в 09:53 ---------- Предыдущие сообщение было в 09:53 ----------

Речь про вот эту строку:
Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
Wire.write(packet, sizeof(packet));
shalex вне форума   Вверх
Старый 15.08.2017, 10:53   #157
BNSF9399
Местный
 
Аватар для BNSF9399
 
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
По умолчанию

Цитата:
Сообщение от shalex Посмотреть сообщение
но как только появятся команды длиннее 2-х байт, то ожидают проблемы.
Да ну
Вы тоже самое делаете, только в другом месте и передаете полученный результат в функцию в качестве аргумента

Цитата:
Сообщение от shalex Посмотреть сообщение
sendPacket(11, packet, sizeof(packet));
зачем передавать аргументом то, что вычислить можно "на месте"?
с sizeof(packet) проблемы будут в том случае, если массив не одномерный.
а чтобы избежать проблем наверняка, то считать лучше так
sizeof(myarray) / sizeof(myarray[0]);

Ну и в целом, что бы я сделал по другому.
1. как пример, я приводил протоколы DCC++ и JMRI WiThrottle, как можно было заметить - они содержат команды в одну строку, в которой есть признак начала и окончания "пакета". Это позволяет "выгребать" буфер приемника и анализировать его не привязываясь к размеру того, что должно было прийти. ну в крайнем случае, я бы использовал не массив, а структуру. ее проще разобрать и однозначно идентифицировать данные.
2. я бы привел все команды к одному стандарту, например первый элемент - команда, 2-й адрес исполнительного устройства (номер выхода на модуле, номер ШИМ и т.п.) и 3-й - значение.
например
10 3 128 - где 10 = команда на изменение скорости, 3 = 3-й пин (PWM A моторшилда), 128 = значение которое нужно записать (хотя, в качестве команды я бы всетаки букву использовал)
или
11 12 1 - где 11 = команда на изменение направления, 12 = 12 пин (DIR A моторшилда), 1 = значение, которое в него записать

12 5 0 - где 12 = команда на переключение аксессуарного декодера, 5 пин значение 0.

3. я бы не делал map на стороне передатчика
Arduino код:
value=map(analogRead(0), 010240255); 
я бы сделал его на стороне приемника. это позволит передатчику передавать полное значение, а на разных модулях (если у нас несколько блок участков и каждый управляется своим приемником) интерпретировать его по своему (аналог настроки скорости вращения серв)
более того, на соседнем форуме я уже коллеге писал и приводил конкретные примеры, для того, чтобы сдвинуть лок с места, значения ШИМ 1 не достаточно, локи разных фирм трогаются при разных минимальных значениях, от 50 до 70, т.е. значение ШИМ нужно менять не в диапазоне 0-255, а 60-255.
да и в любом случае, всегда лучше отдать с передатчика то, что на нем измерили, а на приемнике уже привести в соответствие с тем, как именно этот приемник должен обработать полученные данные.

Можно начинать кидать в меня тапками
BNSF9399 вне форума   Вверх
Старый 15.08.2017, 10:59   #158
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
По умолчанию

Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
Да ну
Вы тоже самое делаете, только в другом месте и передаете полученный результат в функцию в качестве аргумента
А Вы попробуйте, если не верите.
Вопрос с том, что именно передается в sendPacket. Обратите внимание на "*" в описании аргумента packet.

---------- Сообщение добавлено в 10:59 ---------- Предыдущие сообщение было в 10:57 ----------

Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
зачем передавать аргументом то, что вычислить можно "на месте"?
Тут идет работа с указателями. В стек вызова ф-ии идет не сам массив, а указатель на него. Поэтому и надо указывать длину, т.к. по указателю непонятна длина куска памяти, который надо обработать.
shalex вне форума   Вверх
Старый 15.08.2017, 11:03   #159
BNSF9399
Местный
 
Аватар для BNSF9399
 
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
По умолчанию

ЗЫ... А чтобы избежать лишней работы в последствии, я бы сделал команду четырех битной, добавил бы еще адрес устройства, которому адресована эта команда вторым аргументом
10 11 2 128
Понятно, что для I2C это не актуально, но вдруг, комуто понравится реализация передатчика, но связь захочется через RS485 сделать (возможно и сам коллега к этому придет). Такая реализация позволит избежать в дальнейшем перелопачивание всего кода.
Всегда смотрите с прицелом на будущее, я на работе уже запарился вставлять "костыли" в код тех, кто думает и живет сегодняшним днем

---------- Сообщение добавлено в 11:03 ---------- Предыдущие сообщение было в 11:00 ----------

Цитата:
Сообщение от shalex Посмотреть сообщение
А Вы попробуйте, если не верите.
Пробовал Работает.
Прежде, чем указать коллеге на место, где нужно "копать", все было проверено на натурных испытаниях...
Более того, так как я не большой специалист в C++, для меня самого стало неожиданностью, почему отправляется массив из двух элементов, а по ссылке прилетает три. И указанные коллеги ссылки были найдены мной в процессе выяснения, почему так происходит...
BNSF9399 вне форума   Вверх
Старый 15.08.2017, 11:06   #160
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
По умолчанию

Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
Пробовал Работает.
Уже писал, что работает для частного случая и массива из 2-х байт. Длина указателя тоже 2 байта.
Wire.write(packet, sizeof(packet));

Поменяйте размер массива, и sizeof(packet) внутри sendPacket все равно будет выдавать 2.
shalex вне форума   Вверх
Старый 15.08.2017, 11:11   #161
BNSF9399
Местный
 
Аватар для BNSF9399
 
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
По умолчанию

Цитата:
Сообщение от shalex Посмотреть сообщение
т.к. по указателю непонятна длина куска памяти, который надо обработать.
обработать в каком месте?
Wire.write(packet, len); - тут?
И чем принципиально в таком случае отличается

.....
sendPacket(11, packet, sizeof(packet));
.......
void sendPacket(int address, char *packet, int len)
.......
Wire.write(packet, len);
.......

от
.....
sendPacket(11, packet);
.......
void sendPacket(int address, char *packet)
.......
Wire.write(packet, , sizeof(packet));
.......
?

---------- Сообщение добавлено в 11:08 ---------- Предыдущие сообщение было в 11:07 ----------

Цитата:
Сообщение от shalex Посмотреть сообщение
для частного случая и массива из 2-х байт.
нет, я проверял на трех байтах...
но длину массива высчитывал как указывал выше, sizeof(myarray) / sizeof(myarray[0]);

---------- Сообщение добавлено в 11:11 ---------- Предыдущие сообщение было в 11:08 ----------

Цитата:
Сообщение от shalex Посмотреть сообщение
Тут идет работа с указателями. В стек вызова ф-ии идет не сам массив, а указатель на него.
на сколько я понимаю, принципиально это влияет только на то, что все изменения которые вы внесете в функции в этот массив, будут применены к нему глобально, а не локально...
BNSF9399 вне форума   Вверх
Старый 15.08.2017, 11:18   #162
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
По умолчанию

Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
И чем принципиально в таком случае отличается
Отличается тем, что sizeof(packet) внутри sendPacket всегда будет выдавать 2.

Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
нет, я проверял на трех байтах...
но длину массива высчитывал как указывал выше, sizeof(myarray) / sizeof(myarray[0]);
Тут нужен полный текст, сложно сказать в каком контексте это используется.

---------- Сообщение добавлено в 11:18 ---------- Предыдущие сообщение было в 11:15 ----------

Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
на сколько я понимаю, принципиально это влияет только на то, что все изменения которые вы внесете в функции в этот массив, будут применены к нему глобально, а не локально...
Типа того, т.к. при вызове в sendPacket не передается копия переменной packet, а только адрес памяти, с которого начинается глобальная переменная packet.
shalex вне форума   Вверх
Старый 15.08.2017, 11:25   #163
BNSF9399
Местный
 
Аватар для BNSF9399
 
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
По умолчанию

Цитата:
Сообщение от shalex Посмотреть сообщение
Тут нужен полный текст
Wire.write(packet, sizeof(packet) / sizeof(packet[0]);
BNSF9399 вне форума   Вверх
Старый 15.08.2017, 15:25   #164
Alexandro
Заглянувший
 
Аватар для Alexandro
 
Регистрация: 07.09.2015
Адрес: SPb
Сообщений: 76
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 8
Поблагодарили 6 раз(а) в 6 сообщениях
Репутация: пока неопределено (6)
По умолчанию

Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
3. я бы не делал map на стороне передатчика
а передавать занчение больше 255 как ?
Alexandro вне форума   Вверх
Старый 15.08.2017, 15:34   #165
BNSF9399
Местный
 
Аватар для BNSF9399
 
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
По умолчанию

Цитата:
Сообщение от Alexandro Посмотреть сообщение
а передавать занчение больше 255 как ?
всмысле как??? что считали в analogRead - то и передавайте.
Да хоть 4294967295 можете передать, как unsigned long
В чем проблема то?
Я к чему... Вот, допустим, у вас два блок участка управляемых с одного пульта.
Один из них станционный или маневровый, где максимальная скорость ограничена.
Передавая все, что вы сняли с analogRead пульта, на модулях можно замапить по разному. На главном ходу на полную, а на станции - в половину, к примеру.
Можно, конечно и замапленное еще раз замапить, но это как то не кошерно
BNSF9399 вне форума   Вверх
Старый 15.08.2017, 15:57   #166
Alexandro
Заглянувший
 
Аватар для Alexandro
 
Регистрация: 07.09.2015
Адрес: SPb
Сообщений: 76
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 8
Поблагодарили 6 раз(а) в 6 сообщениях
Репутация: пока неопределено (6)
По умолчанию

Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
Да хоть 4294967295 можете передать, как unsigned long
одним байтом ?
Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
Один из них станционный или маневровый, где максимальная скорость ограничена.
я планировал отдельно режим маневров с выбором модуля делать
ограничения скорости по блок-участкам можно локально на модулях сделать.
А так же на пульте можно разные скоростные режимы для разных типов локов сделать ( паровоз/тепловоз/ и тд ).

я с пакетами опять подзапутался - если на пульте N-е кол-во переменных от кнопок и потенциометров - как всю передачу данных организовать - последовательно каждую комманду по 2 байта или массивом
Alexandro вне форума   Вверх
Старый 15.08.2017, 16:02   #167
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
По умолчанию

Цитата:
Сообщение от Alexandro Посмотреть сообщение
я с пакетами опять подзапутался - если на пульте N-е кол-во переменных от кнопок и потенциометров - как всю передачу данных организовать - последовательно каждую комманду по 2 байта или массивом
Можно сделать так - команды непосредственно не выполняются/не отправляются, а помещаются в некую очередь.
Другая ф-ия смотрит эту очередь и отправляет по мере сил или по мере загруженности канала.
shalex вне форума   Вверх
Старый 15.08.2017, 17:09   #168
Alexandro
Заглянувший
 
Аватар для Alexandro
 
Регистрация: 07.09.2015
Адрес: SPb
Сообщений: 76
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 8
Поблагодарили 6 раз(а) в 6 сообщениях
Репутация: пока неопределено (6)
По умолчанию

я сейчас пробовал с таким вариантом -
Код:
void loop()
{
  value=map(analogRead(0), 0, 1024, 0, 255);
  if(value!=speed)
  {
    
    speed=value;

    packet[0]=10; // 10 - будет команда на изменение скорости
    packet[1]=speed; // значение - скорость

    sendPacket(8, packet,sizeof(packet));}
  {
  if ( digitalRead(2) == HIGH ) { dir=1;} else { dir=0;}
   packet[0]=11; // 11 - будет команда на изменение направления
   packet[1]=dir; // значение - скорость

    sendPacket(8, packet,sizeof(packet));}
и тд
Alexandro вне форума   Вверх
Старый 15.08.2017, 17:17   #169
BNSF9399
Местный
 
Аватар для BNSF9399
 
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
По умолчанию

Цитата:
Сообщение от Alexandro Посмотреть сообщение
одним байтом ?
зачем вам байты, прочитайте то, что я выше писал, как бы сделал я...

Цитата:
Сообщение от Alexandro Посмотреть сообщение
ограничения скорости по блок-участкам можно локально на модулях сделать.
ремапиногом, правильно? а зачем?

Цитата:
Сообщение от Alexandro Посмотреть сообщение
последовательно каждую комманду по 2 байта или массивом
отвяжитесь от байтов, передавайте структурой или текстом!
рано или поздно, вы поймете, что вам байтов не хватает и начнете перелопачивать весь код, о чем я также выше писал. не живите днем сегодняшним, смотрите в будущее и делайте на перспективу. иначе, потом придется "костыли" вставлять в код...
BNSF9399 вне форума   Вверх
Старый 15.08.2017, 17:54   #170
Alexandro
Заглянувший
 
Аватар для Alexandro
 
Регистрация: 07.09.2015
Адрес: SPb
Сообщений: 76
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 8
Поблагодарили 6 раз(а) в 6 сообщениях
Репутация: пока неопределено (6)
По умолчанию

Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
отвяжитесь от байтов, передавайте структурой или текстом!
да я бы рад,но с байтами мне есть от чего плясать ,а примеров со строкой у меня не имеется.Я понимаю, что вы имели в виду,но без контекста и с 0.5 не разобраться будет )))
какой из примеров по строке в IDE брать за основу ?
Alexandro вне форума   Вверх
Старый 15.08.2017, 17:57   #171
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
По умолчанию

Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
обработать в каком месте?
Wire.write(packet, len); - тут?
И чем принципиально в таком случае отличается
Хорошо, попробую другими словами...


Поменял тип элементов массива и его размерность.
Несложно посчитать, что в памяти массив займет 20 байт (4*5=20).
"unsigned long" занимает 4 байта, элементов в массиве 5 шт.

К анализу предлагаю такой несложный скетч:

Код:
unsigned long  packet[5]; 

void setup() 
{ 
  Serial.begin(250000);
  sendPacket(packet); 
} 

void loop() 
{ 
   
} 

void sendPacket(unsigned long *packet)
{ 
  Serial.print("sizeof(packet[0]):");
  Serial.println(sizeof(packet[0]));

  Serial.print("sizeof(packet):");
  Serial.println(sizeof(packet));
}
выдает ровно то, что я пытаюсь Вам объяснить.

Не открывая ответ, подумайте, что на Ваш взгляд выдаст ф-ия sendPacket в порт, в соответствии со скетчем?
sizeof(packet[0]): - ?
sizeof(packet): - ?

Если правильно понял, то с Вашей точки зрения скетч напишет:
sizeof(packet[0]): 4
sizeof(packet): 20

... однако ...

оффтопик
shalex вне форума   Вверх
Старый 15.08.2017, 18:31   #172
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
По умолчанию

Про указатели.

Кстати, нельзя не заметить что вот так непринужденно начали работать на ТС сейчас про С все расскажем, уже было про обработчики событий/команд и т.д. ...

оффтопик
shalex вне форума   Вверх
Старый 15.08.2017, 20:54   #173
BNSF9399
Местный
 
Аватар для BNSF9399
 
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
По умолчанию

Цитата:
Сообщение от Alexandro Посмотреть сообщение
а примеров со строкой у меня не имеется
я вам приводил массу ссылок и даже кусков кода... изучайте.
все это реализовано в DCC++, ну разве что даные там через serial гоняются, но это не принципиально, так как всеравно считывается из буфера и побайтно.

---------- Сообщение добавлено в 20:54 ---------- Предыдущие сообщение было в 20:37 ----------

Цитата:
Сообщение от shalex Посмотреть сообщение
Хорошо, попробую другими словами...
хм... снимаю шляпу...
сам лопух, я же не со ссылкой "ковырялся", а с копией...
со ссылкой действительно выдает всегда 2...
BNSF9399 вне форума   Вверх
Старый 15.08.2017, 23:02   #174
BNSF9399
Местный
 
Аватар для BNSF9399
 
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
По умолчанию

Цитата:
Сообщение от shalex Посмотреть сообщение
вот так непринужденно начали работать на ТС
и не говорите...

Цитата:
Сообщение от Alexandro Посмотреть сообщение
а примеров со строкой у меня не имеется
вникайте... Потенциометр к пину A0 подключайте.
Пульт:
Arduino код:
#include <Wire.h> 
#define maxCommandLenght 17
/*
 * определяем максимальную длину команды из расчета <command addr subaddr value>
 * < - признак начала команды
 * command буква - команда
 * addr число от 0 до 9999 - адрес устройсва к которому идет обращение
 * subaddr число от 0 до 9999 - адрес порта/пина на устройствек которому идет обращение
 * value число от 0 до 9999 - значение
 * > - признак окончания команды
 */
char command;
int addr;
int subaddr;
int value;
char commandString[maxCommandLenght+1]; //объявляем переменную для хранения командной строки

int speed;
int current;
int speedPin A0;

void setup()
{
  
Wire.begin();
  
Serial.begin(9600);


void loop() 

  
value=map(analogRead(speedPin), 010240255); 
  if(
value!=speed
  { 
    
// изменились показания 
    
speed=value;
    
addr 0;
    
subaddr =0;
    
command 's';
    
// формируем командную строку
    
sprintf(commandString,"<%c %d %d %d>"commandaddrsubaddrvalue);
    
sendPacket(11commandStringsizeof(commandString));

  } 


void sendPacket(int addresschar *commandStringint ln// не уверен что так 

  
Serial.println(commandString);
  
Serial.println(ln);
  
Wire.beginTransmission(address); // transmit to device #8 
  
Wire.write(commandString,ln);
  
Wire.endTransmission();

приемник
Arduino код:
#include <Wire.h> 
#define maxCommandLenght 17
/*
 * определяем максимальную длину команды из расчета <command addr subaddr value>
 * < - признак начала команды
 * command буква - команда
 * addr число от 0 до 9999 - адрес устройсва к которому идет обращение
 * subaddr число от 0 до 9999 - адрес порта/пина на устройствек которому идет обращение
 * value число от 0 до 9999 - значение
 * > - признак окончания команды
 */
char command;
int addr;
int subaddr;
int value;
char commandString[maxCommandLenght+1]; //объявляем переменную для хранения командной строки

int motor_pin 9;
int address;

void setup () {
  
Wire.begin(11);                // join i2c bus with address #8 
  
Wire.onReceive(receiveEvent); // register event 
  
Serial.begin(9600);        


void loop() 

  
delay(100);


void receiveEvent(int packetLength) {
  
char c;
  
int r =1//чтение активно
  
while (Wire.available()>&& r>0) { //читаем содержимое буфера пока в нем чтото есть или не нашли конец команды
    
Wire.read();
    if(
c=='<'//нашли начало команды
    
{
      
sprintf(commandString,""); //обнуляем сроку команды
    
}
    else if(
c=='>'//нашли конец команды
    
{
      (
char*)commandString//преобразуем строку в массив симводов
      
r=0//прерываем чтение буфера
    
}
    else if(
strlen(commandString)<maxCommandLenght//если текущая длина строки меньше, чем максимальная длина команды
    
{
      
sprintf(commandString,"%s%c",commandString,c); //добавляем к строке прочитанный символ
    
}
  }
  
sscanf(commandString"%c %04d %04d %04d", &command, &addr, &subaddr, &value); //парсим полученную строку в переменные
  
Serial.print("Command: ");
  
Serial.println(command);
  
Serial.print("Address: ");
  
Serial.println(addr);
  
Serial.print("Subaddress: ");
  
Serial.println(subaddr);
  
Serial.print("Value: ");
  
Serial.println(value);
  
// обрабатываем команду 
  
switch(command
  { 
    case 
's'
      
analogWrite(motor_pin,value);
      
Serial.print("Set new speed: ");
      
Serial.println(value); 
    break; 
  }

BNSF9399 вне форума   Вверх
Пользователь сказал cпасибо:
Старый 16.08.2017, 00:42   #175
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
По умолчанию

Цитата:
Сообщение от BNSF9399 Посмотреть сообщение
Потенциометр
С ним, кстати, весело будет Показания постоянно гуляют, надо какой-то "фильтр" ставить.


оффтопик
shalex вне форума   Вверх
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
цифровое управление садовой дорогой Залызныця Садовые жд (Уличные макеты) 76 01.12.2022 08:55
кран едк-2000 цифровое управление manfred Электрика и DCC 1 21.08.2011 20:37
Цифровое управление Marklin Stepanov Электрика и DCC 4 03.02.2010 20:57
помогите разобраться, управление цифровое... Leonar Электрика и DCC 12 20.01.2010 18:02
Цифровое управление Илья Электрика и DCC 26 15.07.2008 19:52


Текущее время: 08:28. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
Copyright © ModelldepO.ru 2006 -