помогите советом.

rembo
Offline
Зарегистрирован: 14.11.2012

хочу передавать данные с аналогово входа в программу, пакет передачи должен быть такой:

начало пакета -- FFh

длина пакета -- 2 байта

состояние канала 1 -- 4 байта + 1 байт crc

состояние канала 2 -- 2 байта + 1 байт crc

состояние канала 3 -- 2 байта + 1 байт crc

собственно вопрос -- как данные с 1 аналогового канала привести к 4 байтному значению.

 

maksim
Offline
Зарегистрирован: 12.02.2012
rembo
Offline
Зарегистрирован: 14.11.2012

ребята, тупая моя голова, подскажите как мне в компорт передавать в hex "00ff0800ee816f"?

step962
Offline
Зарегистрирован: 23.05.2011

rembo пишет:

ребята, тупая моя голова, подскажите как мне в компорт передавать в hex "00ff0800ee816f"?

что вы подразумеваете под "передать в hex"?

Если передачу в HEX-представлении, то ничего - передайте то, что cтоит между кавычками как строку и все.

Если имеется в виду числовое значение - отгрызайте справа (если интересует типичный для архитектуры x86 порядок передачи байтов "от младшего к старшему" или low-endian) по два символа, переводите в числовое значение (очередного байта) и передавайте полученное значение с помощью Serial.write(). 

 

rembo
Offline
Зарегистрирован: 14.11.2012

мне нужно передать данные в программу, программа посылает 02h и ждет ответа --

Serial.write("00ff0800ee816f"); не работает, я понимаю почему, но немогу понять каким макаром мне передать эти данные.

step962
Offline
Зарегистрирован: 23.05.2011

rembo пишет:

Serial.write("00ff0800ee816f"); не работает, я понимаю почему, но немогу понять каким макаром мне передать эти данные.

Ну, тогда передайте эту последовательность таким макаром:

Serial.write(0x6f);
Serial.write(0x81);
Serial.write(0xee);
Serial.write(0x00);
Serial.write(0x08);
Serial.write(0xff);
Serial.write(0x00);

UPD: скорее - все же в обратном порядке (т.е. пресловутый big-endian)

rembo
Offline
Зарегистрирован: 14.11.2012

я понял насчет переворота, спасибо. данные пошли,хотя и с ошибками.

а почему данные в ком порт идут сплошным потоком? запрос-ответ-ожидание-запрос-ответ... не работает?

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

void loop(){
 if (Serial.available()){

Serial.write(0xff);
Serial.write(0x14);
Serial.write(0x00);
Serial.write(0xf7);
Serial.write(0x81);
Serial.write(0x78);
Serial.write(0x53);
Serial.write(0x81);
Serial.write(0xd4);
Serial.write(0x15);
Serial.write(0x82);
Serial.write(0x97);
Serial.write(0xe3);
Serial.write(0x83);
Serial.write(0x66);
Serial.write(0xd1);
Serial.write(0x80);
Serial.write(0x51);
}
}

 

 

rembo
Offline
Зарегистрирован: 14.11.2012

победил:

int zapr=0;

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

void loop(){
zapr = Serial.read();
if (zapr == 0x02){
Serial.write(0x00);
Serial.write(0xFF);
Serial.write(0x08);
Serial.write(0x00);
Serial.write(0xEE);
Serial.write(0x81);
Serial.write(0x6F);
}
}

ардуино отзывается на запрос, только как-то странно:

step962
Offline
Зарегистрирован: 23.05.2011

rembo пишет:

а почему данные в ком порт идут сплошным потоком? запрос-ответ-ожидание-запрос-ответ... не работает?

Потому что вы туда посылаете их сплошным потоком.

Если вы хотите отвечать на запрос (это 0x02 что-ли?) так будьте добры организовать прослушивание поступающей в ком-порт информации, анализировать ее и - при условии обнаружения признаков запроса - генерировать ответ.

И прочитайте, для каких целей используется функция Serial.available()

 

step962
Offline
Зарегистрирован: 23.05.2011

rembo пишет:

победил:

Ну, молодец...
Цитата:

ардуино отзывается на запрос, только как-то странно:

а что тут странного-то? IN-поток полностью соответствует тому, что вы отправляете: 00-ff-08-00-ee-81-6f...

rembo
Offline
Зарегистрирован: 14.11.2012

но программа не видит плату.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Зачем перед FF Вы посылаете 00?

rembo
Offline
Зарегистрирован: 14.11.2012

таков протокол. разобрался. неправильно количество байт передавал.


int zapr=0;

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

void loop(){
  zapr = Serial.read();
  if (zapr == 0x02){
    Serial.write(0x00); // начало пакета
    Serial.write(0xFF); // начало пакета
    Serial.write(0x08); //длина пакета -- 2 байта
    Serial.write(0x00); //
    Serial.write(0x00); //не нужный канал -- 4 байта
    Serial.write(0x00); //
    Serial.write(0x00); //
    Serial.write(0x00); //
    Serial.write(0x00); //crc     
    Serial.write(0xFF); //нужный канал 2 байта
    Serial.write(0xC1); //
    Serial.write(0xC0); //crc
    
}
}

есть предположения как считается crc нужного канала? в соседней теме спрашивал, но так и непонял как вычислить нужный мне метод подсчета crc.

rembo
Offline
Зарегистрирован: 14.11.2012

что-то я непойму опять, каналов же всего 6?

void loop(){
  zapr = Serial.read();
  if (zapr == '1'){
    for (int i = 0; i < 50; i = i + 1){
    ch1=analogRead(i);
    Serial.println(ch1);
}
}
}

а данный код работает. в чем ошибка?

rembo
Offline
Зарегистрирован: 14.11.2012

есть еще вопрос, возможно ли реализовать на 3х uno такую схему -- arduino1 получает запрос, опрашивает arduino 2, получает результат, опрашивает arduion 3, получает результат.

rembo
Offline
Зарегистрирован: 14.11.2012

1-wire? или isp? 

maksim
Offline
Зарегистрирован: 12.02.2012

Вы наверное имели ввиду I2C или SPI.

rembo
Offline
Зарегистрирован: 14.11.2012

да. мне надо с одной ардуины посылать запрос а  с другой получать ответ -- 18 байт.

rembo
Offline
Зарегистрирован: 14.11.2012

мужики, благодаря вашей активной помощи и копания различной информации я медленно но верно иду к решению своей задачи, но не могу решить некоторые элементы -- подключил энкодер через библиотеку encoder. кручу его и получаю в переменную на выходе число, при инициализации платы значение равно 0, при вращении по часовой от 1 и по нарастающей  при вращении против -1 и по убывающей, как как мне это число перегнать в 4 байтное значение? объясните сам алгоритм, над кодом поколдую сам.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

В сообщении #1 уже был ответ

rembo
Offline
Зарегистрирован: 14.11.2012

я прошу рассказать словами.

step962
Offline
Зарегистрирован: 23.05.2011

rembo пишет:

я прошу рассказать словами.

Загрузить адрес переменной, в которой у вас хранится это число, в указатель типа "указатель на байт" (или "указатель на символ") и четыре раза прочитать значения байтов по этому указателю, инкрементируя значение указателя между этими операциями чтения.

Это один рассказ в словах.

Определить объединение (union), один элемент которого - длинное целое, а второй - массив из 4 байтов. Создать переменную этого типа. Сохранить в ней длинное целое, затем прочитать эту переменную как массив из 4 байтов.

Это другой рассказ в словах.

Есть еще, конечно, и третий, и четвертый, но лень. Может быть, еще кто-нибудь подтянется.

Если не помогло, то делать нечего - придется-таки изучать теоретические основы...

 

rembo
Offline
Зарегистрирован: 14.11.2012

спасибо за объяснение, разобрался.