Последовательная связь между двумя Arduino (запрос и получение)

Кто-нибудь может помочь? Я пытаюсь разработать два скетча, где данные могут быть отправлены только тогда, когда для этого сделан запрос между двумя ардуино. Простого приветственного сообщения может быть достаточно. Я попробовал Serial Ascii Call and Response в IDE arduino, но у меня это не сработало ???. Кода скетчей ниже

//Скетч Arduino 1
uint16_t alpha;
uint16_t lambo;
Banana nanas;    //для хранения объекта Banana
uint16_t dataArray[2];
void Setup(){
    Serial.begin(9600);
    establishContact();
}

void loop(){
    alpha=nanas.getRad;
    lambo = nanas.getBars;
    dataArray[0] = alpha;
    dataArray[1] = lambo;
    Serial.write((uint8_t*)dataArray, sizeof(dataArray));
    Serial.flush();   // очищаем последовательный порт
}

void establishContact()
{
    if (Serial.available())
    {
        while (Serial.available()  > 0)
        {
            int newByte = Serial.read();
            if (newByte == 'Q')
            {
                Serial.write(newByte);
                Serial.flush();
            }
        }
    }
}

Скетч для другой Arduino показан ниже

//Скетч Arduino 2
static char buffer[2];
void setup(){
    Serial.begin(9600);
    Serial1.begin(9600);
    establishContact();
}
void loop(){
    if(Serial1.available())
    {
        while(Serial1.available() > 0){
            uint16_t gondola1 = Serial1.read(); 
            uint16_t gondola2 = Serial1.read();
            uint16_t crixus = gondola2 >> 8;
            crixus = (crixus | gondola1);

            gondola1 = Serial1.read(); 
            gondola2 = Serial1.read();
            uint16_t mario = gondola2 >> 8;
            mario = (mario | gondola1);
            buffer[0] = crixus;
            buffer[1] = mario;
            Serial.write(buffer, sizeof(buffer);
            Serial1.flush();
        }
    }
}
void establishContact(){
    if (Serial.available()){
        uint16_t newByte = Serial.read();
        if(newByte == 'Q')
        {
            Serial.flush();
            Serial.write(newByte);
        }
    }
}

, 👍1

Обсуждение

Пожалуйста, дополните. Какие платы используете? Какие библиотеки вы используете? (код не компилируется как есть) Какие соединения вы сделали между платами? Кроме того, я не могу понять, что именно вы хотите, чтобы какая плата получала что от другой платы? Отправить сообщение обратно на плату отправителя? Отправить сообщение в другом месте?, @foivaras

@foivaras .. рассматриваемые платы представляют собой Arduino Uno, к которому подключен датчик, и Arduino Mega, который используется для приема отправляемых данных. Соединения представляют собой обычные tx / rx от uno к serial1 на mega. других библиотек нет. Мега запрос данных от уно..уно видит команду запроса и потом отправляет данные..мега получает данные и запрос еще данных. Это в двух словах, @PayneLaidBack

если вы не используете какую-либо библиотеку, ваш код не скомпилируется. Первый скетч имеет необъявленный тип сервопривода. Второй скетч выдает ошибку «redeclaration of uint16_t gondola1»., @foivaras

@foivaras класс Servo, который я использовал, - это просто случайное имя, которое я принял ... оглядываясь назад, я должен был изменить его на что-то другое ... я просто хотел показать, что есть класс, из которого можно объявить объект, чтобы вызвать его соответствующие методы. Я сейчас отредактирую скетчи, @PayneLaidBack

Setup() должно быть setup() в первом скетче? Что такое «банан»? Зачем все усложнять, если все, что вы хотите сделать, это отправить «Hello world» по запросу? Если это не является вашей целью, тогда отредактируйте свой пост и точно скажите, для чего нужны наброски и что именно вы подразумеваете под «у меня это не сработало»., @SoreDakeNoKoto


1 ответ


Лучший ответ:

3

не очень легко следовать вашему коду, но вот процедура "hello world" для отправки данных по запросу между двумя Arduino:

  • загрузите этот код в arduino uno, прежде чем выполнять какое-либо подключение к контактам 0 и 1 платы:

    /**
     * Код для серверной части (arduino uno)
     */
    
    
    uint8_t data2send = 'A'; //данные для отправки по полученному запросу
    uint8_t incomingByte;
    
    void setup() {
            Serial.begin(9600);   
    }
    
    void loop() {
            // отправлять данные только при получении данных:
            if (Serial.available() > 0) {
    
                    // прочитать входящий байт:
                    incomingByte = Serial.read();
    
                    if(incomingByte=='Q'){  //если входящие данные являются ожидаемым запросом (код запроса = 'Q' в этом примере)
                            Serial.write(data2send);        
                    }
            }
    }
    
  • подключиться:

    UNO  | MEGA
    ------------
    pin0 | pin18
    pin1 | pin19
    GND  | GND
    
  • загрузить в arduino mega этот код:

     /**
    * код для ардуино мега.
    *
    * прокси между Serial0 и Serial1
    *
    * отправить данные на Serial0, чтобы переслать их на Serial1.
    * когда данные получены от Serial1, они будут отправлены на Serial0.
    */
    
    void setup() {
            // инициализируем оба последовательных порта:
            Serial.begin(9600);
            Serial1.begin(9600);
    }
    
    void loop() {
            // читаем с порта 1, отправляем на порт 0:
            if (Serial1.available()) {
                    int inByte = Serial1.read();
                    Serial.write(inByte);
            }
    
            // читаем с порта 0, отправляем на порт 1:
            if (Serial.available()) {
                    int inByte = Serial.read();
                    Serial1.write(inByte);
            }
    }
    
  • откройте серийный монитор мега и отправьте несколько символов. Убедитесь, что вы получаете данные обратно только при отправке символа 'Q'.

,

вообще говоря, если данный ответ вас удовлетворяет, вы должны пометить его как принятый. См. также [часто задаваемые вопросы о принятии ответов] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). Спасибо., @foivaras