Управление массивом портов.

Alexei Baluykevich
Offline
Зарегистрирован: 14.04.2020

Всем здорова. Я новичок в данной среде, да и не быдлокодил уже очень давно.

Вопрос:

допустим имеем массив портов с номерами портов ввода вывода:

int myPins[] = {2,4,8,3,6,9,11};

byte[7] = data;

Надо по значению данных в битовом исчислении включать комбинацию портов myPins[] кто попадает под 0 или 1.

 

Как это лучше сделать? В операторе for? перечислять  массив портов и причислять им данные

data = byte(Serial.read()); <<< и как эту строчку правильно написать?

for(int i; i<=7; i++)

    digitalWriter(myPins[i], data[i]);

  

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Во первых не byte[7] = data;, а byte data[7];. А лучше boolean data[7];

Во вторых

for(int i=0; i<7; i++){

data[i] = byte(Serial.read());

}

В третих 

for(int i=0; i<7; i++){

    digitalWrite(myPins[i], data[i]);

}

И учите си

Alexei Baluykevich
Offline
Зарегистрирован: 14.04.2020

Сложная тема. Вроде написано правильно, и компилятор принимает. по факту ерунда какая то получается. Какие бы данные не вводил б, все время на всех битах получаю единицу.

sadman41
Offline
Зарегистрирован: 19.10.2016

Конечно будет ерунда, если биты и байты мешаете в кучу. Вот это что - byte[7] = data; ?

Alexei Baluykevich
Offline
Зарегистрирован: 14.04.2020

Как имея число '127' перевести в битовое исчисление '1111111' и выдать его как массив бит по одному биту? 

sadman41
Offline
Зарегистрирован: 19.10.2016

Никак не переводить. Числа внутри МК уже двоичные. Читать конкретный бит можно через bitRead(), например: https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bitread/

Alexei Baluykevich
Offline
Зарегистрирован: 14.04.2020

мда, все так просто.

Alexei Baluykevich
Offline
Зарегистрирован: 14.04.2020

работает, пины переключаются

Alexei Baluykevich
Offline
Зарегистрирован: 14.04.2020

Для начала хочу разобраться с терминалом.

Написал простенький код : принять массив данных в веденные в терминал в битах, и через некоторое время их вывести на экран терминала.

Только не в битах, не в любом другом виде... На терминал приходит какая то белиберда.

 

 

byte  incomingByte[12];   // переменная для хранения полученного байта
 int lengh = 12;
void setup() {
    Serial.begin(9600); // устанавливаем последовательное соединение
}
 
 
void loop() {
    if (Serial.available() > 0) {  //если есть доступные данные
        // считываем байт
        Serial.readBytes( incomingByte , 12 );   // тут ошибся?
delay (500);
        // отсылаем то, что получили
        Serial.print("message: ");
        Serial.println
          (
            String(incomingByte[0])
            +String(incomingByte[1])
            +String(incomingByte[2])
            +String(incomingByte[3])
            +String(incomingByte[4])
            +String(incomingByte[5])
            +String(incomingByte[6])
            +String(incomingByte[7])
            +String(incomingByte[8])
            );
    }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

ну первая очевидная ошибка - проверяете Сериал на наличие одного байта, а читаете 12

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ТС - Вы бредите.

Считайте 1 (один) байт, который содержит все нужные Вам биты. Это 1 (одно) число. Восьмеричное или шестнадцатеричное. Далее проведите логическое "И" с 1, потом с 2, (1<<1) и т.д. до (1<<i).

Гля - учите си!