По ТЗ на Ардуино Нано приходит строка (в скетче видно,что она собирается посимвольно),где порядок единиц и нулей определяет какие пины включить а какие - выключить.Использовано управление портами через регистры а то скорость работы совсем уж маленькая. приходящая строка это 11 управляющих бит информации. 1 бит - D2, 2 бит, - D3 и так далее по накатанной.В текущем скетче какую бы строку я не посылал (при условии её длинны 11 символов) D13 зажигается (про остальные знать не могу).данные посылались в разных режимах через com port монитор Забыл упомянуть - пока реализовано лишь частичное управление,ибо использован 1 оператор управления - PORTB. Вот Спойлер: код Код (C++): int i; int j; char inc[11]; char CharArrayVar[9]; char CharVar; String inc2; String out; int pins[11] = {0,0,0,0,1,1,1,1,1,1,1}; // 1 - OUTPUT 0 - INPUT char val; void setup() { Serial.begin(9600); //----------------------- for (i = 2;i <= 13;i++) { if (pins[i - 2] == 0) { pinMode(i,INPUT); out += ("0;"); } if (pins[i - 2] == 1) { pinMode(i,OUTPUT); out += ("1;"); } } //PORTB = B00011100; Serial.println(out); Serial.println("go"); Serial.flush(); char CharArrayVar[8] = {0,0,0,0,0,0,0,0}; } void loop() { char CharArrayVar[8] = {0,0,0,0,0,0,0,0}; inc2 = ""; int ai = 0; while (true) { if (Serial.available() > 0) { val = Serial.read(); inc[ai + 1] += val; ai += 1; } if (ai == 11) { break; } } Serial.flush(); //Serial.println(inc); for (j = 3;j <= 8; j++) { CharArrayVar[j] = inc[14 - j]; } CharVar = 0; for(int i = 1; i<8; i++) { CharVar |= CharArrayVar[i] << (7-i); } PORTB = CharVar; Serial.println(CharVar); }
Был случай когда от данных,посланных в функции setup, бесился код в loop: непонятные данные и т.д. Сам не знаю,надо оно или нет
Ооох. Короче, вводные, если я правильно понял: 1. Входящая строка должна быть чётко 11 символов длиной; 2. В строке нолики и единицы привязаны к пинам, начиная с соответствия "первый символ - пин D2"; 3. Надо по этой строке управлять пинами. Если так, то простейший код: Код (C++): String buff; void parseCommand(const String& command) { int startPin = 2; for(int i=0;i<command.length();i++,startPin++) { char ch = command[i]; byte level = ch == '1' ? HIGH : LOW; digitalWrite(startPin,level); } } void setup() { Serial.begin(9600); } void loop() { while(Serial.available()) { char ch = Serial.read(); buff += ch; if(buff.length() == 11) { parseCommand(buff); buff = ""; } } }
Благодарю за помощь.Одно из условий ТЗ было управление через регистры напрямую,полагаю теперь будет проще.Спасибо
Может кто опыт имеет,логику работы текущего кода понять пока не могу. Посылаю строку Спойлер: ответ ардуино на посылки запрос - ответ 00000000000 - 11111111111111111111111111110000 00000000011 - 11111111111111111111111111110100 11111111111 - 11111111111111111111111111110111 Первое - то что я отсылал через монитор, второе - эта же строка после преобразований. А ведь должно быть одно и то же,только первое - строка, а второе - бинарная переменная для PORTB Код: Спойлер: вот он Код (C++): String buff; char Charu[11] = {0,0,0,0,0,0,0,0,0,0,0}; int pins[11] = {0,0,0,0,1,1,1,1,1,1,1}; // 1 - OUTPUT 0 - INPUT String out; void setup() { Serial.begin(9600); //----------------------- for (int i = 2;i <= 13;i++) { if (pins[i - 2] == 0) { pinMode(i,INPUT); out += ("0;"); } if (pins[i - 2] == 1) { pinMode(i,OUTPUT); out += ("1;"); } } //PORTB = B00011100; Serial.println(out); Serial.println("go"); Serial.flush(); } void loop() { while(Serial.available()) { char ch = Serial.read(); buff += ch; if(buff.length() == 11) { char charBufVar[11]; buff.toCharArray(charBufVar, 11); char Charu[11] = {0,0,0,0,0,0,0,0,0,0,0}; for (int ab = 0; ab <= 5; ab++) { Charu[ab + 3] = charBufVar[11 - ab]; } char CharVar = 0; Serial.println(buff); for(int i = 0; i<8; i++) { CharVar |= Charu[i] << (7-i); } PORTB = CharVar; Serial.println(CharVar,BIN); buff = ""; } } }