Последовательная связь между двумя 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);
}
}
}
@PayneLaidBack, 👍1
Обсуждение1 ответ
Лучший ответ:
не очень легко следовать вашему коду, но вот процедура "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
- Сбой Arduino во время последовательной печати без очевидной причины
- 16-герцовая плата Uno R3 против платы Arduino Uno R3
- Последовательная связь между двумя Arduino не работает при отправке строки в программе с большим количеством функций.
- Отладка различного поведения последовательного приема/отправки между Uno и Mega
- Последовательная связь между Arduino
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как узнать частоту дискретизации?
Пожалуйста, дополните. Какие платы используете? Какие библиотеки вы используете? (код не компилируется как есть) Какие соединения вы сделали между платами? Кроме того, я не могу понять, что именно вы хотите, чтобы какая плата получала что от другой платы? Отправить сообщение обратно на плату отправителя? Отправить сообщение в другом месте?, @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