Последовательная связь между двумя 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
- Отладка различного поведения последовательного приема/отправки между Uno и Mega
- Последовательная связь между Arduino
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
Пожалуйста, дополните. Какие платы используете? Какие библиотеки вы используете? (код не компилируется как есть) Какие соединения вы сделали между платами? Кроме того, я не могу понять, что именно вы хотите, чтобы какая плата получала что от другой платы? Отправить сообщение обратно на плату отправителя? Отправить сообщение в другом месте?, @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