Передать число по UART

Доброго дня! Помогите плиз с решением.
Я хочу передать число с одной Ардуины на другую посредством rx/tx интерфеса
как мне byte передать в сериал как char?

  byte x = ((PINB&(1<<0))?(1<<0):0)       \
         | ((PINB&(1<<1))?(1<<1):0)    \
         | ((PINB&(1<<2))?(1<<2):0)    \
         | ((PINB&(1<<3))?(1<<3):0);

Serial.write(x);

так как выше не получается, вторая Ардуина не понимает. Если передаю пр
Serial.write ('2');
то все в порядке.

if (Serial.available() )
{
char ch=Serial.read();

if (ch=='2') 
 {digitalWrite(ledStart, HIGH);  }
else 
 {digitalWrite(ledStart, LOW);  }

} // if

вот так я пытаюсь получить значение на приемнике

Никак. Вопрос представляет собой бессмысленный набор слов и ответить на него невозможно.

Ну, передавайте не символом, а числом, кто Вам не даёт? Вариантов миллион

Пример №1

byte b = 2;
Serial.write(b);

Пример №2

Serial.write((byte)2);

Пример №3

Serial.write('2'-'0');

Можно ещё десяток вариантов привести.

Вам лень код нормально вставить? Или умышленно издеваетесь? Умеете же!

Это “код” не смотрел и смотреть не буду, пока не вставлен по-человечески. И уже начинаю жалеть, что подсказал Вам как передавать.

А с чего ты решил, что это равно ‘2’?

да, фишка в том,что бывает что и равно 2, а бывает и 8
мне нужно получить результат этого выражения на второй ардуине
он может быть от 0 до 8

@edem , у меня складывается впечатление, что Вы не понимаете разницу между 2 и ‘2’.

ок, нет проблем, если бы все понимал, то и вопроса не было

итак 2 - это число
‘2’ - это символ
когда я пишу в сериале ‘2’ - то передаю код этого символа. Насколько я знаю так работает сериал.
что я передаю если Serial.print(2) ? Вероятно это же число и передаю.

Только, что мне это дает? У меня результат выражения имеет тип byte. И именно с этим типом у меня проблемы.

Число 2 - это 0x02, символ ‘2’ - это 0x32. Насколько это одно и то же - вам виднее

ок, как мне отправить выражение через сериал

byte  x = ((PINB&(1<<0))?(1<<0):0)       \
         | ((PINB&(1<<1))?(1<<1):0)    \
         | ((PINB&(1<<2))?(1<<2):0)    \
         | ((PINB&(1<<3))?(1<<3):0);

и принять его

Не понятно, какие проблемы с типом byte?
Как вы выше написали, если на приемнике используете
if (ch==‘2’)
Значит передавать надо Serial.print(x). Если x меньше 10.

Но наверно лучше на приемнике сравнивать
if (ch==2)
Тогда передавать надо Serial.write(x)

1 лайк

я там вверху написал, и вероятно, напрасно
что проблем с передачей и приемом
типа Serial.write(‘2’) у меня нет. ВСЕ ОТЛИЧНО РАБОТАЕТ

именно это вариант у меня не работает.

В 5 стр. замените
if (ch==‘2’)
на
if (ch==2)

КОНГЕНИАЛЬНО

В итоге:

на передатчике

delay(1000);
    x = ((PINB&(1<<0))?(1<<0):0)       \
         | ((PINB&(1<<1))?(1<<1):0)    \
         | ((PINB&(1<<2))?(1<<2):0)    \
         | ((PINB&(1<<3))?(1<<3):0);

    Serial.write(x);

на приемнике

if (Serial.available() )
{
int ch=Serial.read();

if (ch==2) 
 {digitalWrite(ledStart, HIGH);  }
else 
 {digitalWrite(ledStart, LOW);  }

Похоже, вы сами не понимаете, чего хотите. Попробуйте расписать подробно словами, что вы пытаетесь передать и почему это что-то должно равняться ‘2’ (т.е. 0x32 в шестнадцатеричном или 50 в десятичном исчислении)

Что это за ужас???

Если это - чтение четырех младших бит порта B, то это можно записать много короче

byte  x = PINB & 0xF;

Учите битовые операции

1 лайк
byte  x = PINB & 0xF;

ок! задействованые пины идут по порядку/ надо попробовать

  byte x = ((PINB&(1<<0))?(1<<0):0)       \
         | ((PINB&(1<<1))?(1<<1):0)    \
         | ((PINB&(1<<2))?(1<<2):0)    \
         | ((PINB&(1<<3))?(1<<3):0);

что по вашему может находится в переменной x?

Ху…ня ?

3 лайка

Соглашусь с коллегой.
А вывести просто в серийный порт (пока без второй ардуинки), и посмотреть чего получается - это неподъёмная задача?

да, а если пропустить через UART получится - ‘2’