Ви не увійшли.
Сторінки 1
Правильне рішення цієї задачі не таке просте, як здається на перший погляд.
Це я точно вже усвідомив.
трохи згодом буду продовжувати, благо для маркерів місце є, дані в мене до 180ти...
Дякую за допомогу!
Дякую, буду "вкурювать"...
Або якщо просто додати в масив якийсь перший байт та останній, які не співпадають з основними. А в приймачеві розділити по байтах та брати інформаційні після першого "кодового" і останній для перевірки.
Так проканає?
Вже наступив
Один раз таке трапилось
Виходить тільки це мені допоможе?:
Свои переменные преобразовать в строку,
Передать: 0х55,0хАА (признак начала посылки) , "строка первой переменой", "строка второй переменой, 0х0D(символ "возврат коретки"окончание посылки)
На приемнике получив символ 0х0D ожидать признак начала посылки 0х55,0хАА, если получен принимать строковые переменные.
Строковые переменные преобразовать в числа.
Можно хоч трохи вразуміліше, як для початківця?
wsx пише:Так ось і є простіше. Підключив - все працює.
Робочий скетч, передавач:
Это не рабочие решение.
Это работает только до тех пор пока индекс буффера передачи совпадает с индексом буфера приемника
Включите/выключите пару раз дурину на приемной стороне и Вы очень быстро получите ситуацию когда приемник будет принимать первым байтом buff[1] ,а вторым buff[1]
Спробував пару десятків разів, покищо не було такого...
Але ж і передавач задає порядок:
buff[0]=valud;
buff[1]=vallr;
Serial.write(buff,2);
буду мати на увазі, але поки все ок!
wsx пише:скомпілювало, один серво працює. підключу другий.
а как Вы будете различать где в посылке байты для первой сервы, а где для второй?
Ну ось так
valud=buff[0];
vallr=buff[1];
Може теж щось невірно? але воно працює
Потому что тип данных не совпадает. Вы массив buff[2] определии как тип int ,
функция принимает тип byte , выше специально привел сноску с описания функции и выделил цветом требуемый тип.
Откройте любой учебник по Си и прочитайте, что такое типы данных, и чем отличается тип byte от int .
Та вот читав - недочитав... мозок закипів, починаючий...
хотілось щоб носом ткнули.. але й так допомогло.
Дякую!
Так ось і є простіше. Підключив - все працює.
Робочий скетч, передавач:
#include <SoftwareSerial.h>
int valud;
int vallr;
byte buff[2];
int potpinud=0;
int potpinlr=1;
void setup()
{
Serial.begin(9600,SERIAL_8N1);
pinMode(potpinud,INPUT);
pinMode(potpinlr,INPUT);
}
void loop()
{
valud=analogRead(potpinud);
vallr=analogRead(potpinlr);
valud=map(valud,0,1023,1,180);
vallr=map(vallr,0,1023,1,180);
buff[0]=valud;
buff[1]=vallr;
Serial.write(buff,2);
delay(50);
}
приймач:
#include <SoftwareSerial.h>
#include <Servo.h>
Servo servoud;
Servo servolr;
int valud;
int vallr;
byte buff[2];
void setup()
{
Serial.begin(9600,SERIAL_8N1);
servoud.attach(6);
servolr.attach(5);
}
void loop(){
Serial.readBytes(buff,2);
valud=buff[0];
vallr=buff[1];
if (valud>0) {
valud=valud-1;
servoud.write(valud);
delay(20);}
if (vallr>0) {
vallr=vallr-1;
servolr.write(vallr);
delay(20);}
}
схоже помилка була така
не int buff[2];
а byte buff[2];
скомпілювало, один серво працює. підключу другий.
Дякую за допомогу, але нічого не зрозумів... буду намагатись. Якось простіше ніяк неможна?
Та чому всеж таки не працює Serial.write(buf, len) і Serial.readBytes(buffer, length) ? ну повинно ж передавати декілька байтів по опису...
Щось я заплутався.. Отже масив з бітів, а не з байтів? який тоді від нього сенс? Один байт можно і так відправити - отримати
Serial.write(val);
val=Serial.read();
Так все працює добре на один серво. Але мені потрібно два байти відправити (а потім ще більше). Як це зробити?
По одному ж не можна відправляти, приймач не зрозуміє хто є хто..
Ну ось же, байт.. або я щось недогоняю?
Serial.write(val), Serial.write(buf, len)
Отправляет в порт val численное значение или строку, или отправляет количество len байт из буфера buf.
Serial.readBytes(buffer, length)
Читает данные из порта и закидывает их в буфер buffer . Также указывается количество байт, который нужно записать – length (чтобы не переполнить буфер).
А це:
Serial.write(buff[2]);
спроба доступа за межі масива buff. Це невизначена поведінка.
Почитайте основи про масиви в C (у C++ також використовуються C-шні масиви).
По книжці Serial.write(buf, len) , але так не компілюється
Serial.write(buff[2]); так пройшло, але мабуть це не вірно...
Читав вже перечитав, мозок пухне, не хоче компілювати... Тому і звернувся по допомогу.
https://www.arduino.cc/reference/en/lan … readbytes/:
Serial.readBytes(buffer, length)
Одразу так і робив, але не компілюється і все...
Така помилка: Compilation error: no matching function for call to 'HardwareSerial::readBytes(int [2], int)'
Доброго дня, Шановні. Я ну прям дуже початківець, допоможіть будь ласка розібратися.
Задача в мене така: одна ардуінка працює як пульт, зчитує джойстик; друга керує двома сервоприводами; зв'язок між ними по UART.
Один байт передавати навчився, але мені потрібно як мінімум 2 (потім більше). Підкажіть, як коректно передавати та приймати масив, зайшов в тупік, приймач не компілюється ні в яких варіантах...
передавач, скомпілювався, але чи вірно Serial.write(buff[2]);
#include <SoftwareSerial.h>
int valud;
int vallr;
int buff[2];
int potpinud=0;
int potpinlr=1;
void setup()
{
Serial.begin(9600,SERIAL_8N1);
pinMode(potpinud,INPUT);
pinMode(potpinlr,INPUT);
}
void loop()
{
valud=analogRead(potpinud);
vallr=analogRead(potpinlr);
valud=map(valud,0,1023,1,180);
vallr=map(vallr,0,1023,1,180);
buff[0]=valud;
buff[1]=vallr;
Serial.write(buff[2]);
delay(20);
}
приймач:
#include <SoftwareSerial.h>
#include <Servo.h>
Servo servoud;
Servo servolr;
int valud;
int vallr;
int buff[2]={0,0};
void setup()
{
Serial.begin(9600,SERIAL_8N1);
servoud.attach(6);
servolr.attach(5);
}
void loop(){
buff=Serial.readBytes();
valud=buff[0];
vallr=buff[1];
if (valud>0) {
valud=valud-1;
servoud.write(valud);}
if (vallr>0) {
vallr=vallr-1;
servolr.write(vallr);}
delay(20);
}
Ніяк не компілює buff=Serial.readBytes();
Сторінки 1