как преобразовать строку кода для arduino, чтобы получить значение

я отправляю значение 1500 с другого MCU с

 fdserial_txChar(transmit, send >> 7);    // отправляем старшие 7 бит
 fdserial_txChar(transmit, send & 0x7F);  // отправляем младшие 7 бит

и получал его с кодом, который выглядел так

servo1  = fdserial_rxChar(receive) << 7;    // получаем старшие 7 бит
servo1 += fdserial_rxChar(receive) & 0x7F;  // получаем и добавляем младшие 7 бит

как мне переписать принимающий код, чтобы Arduino его скомпилировал?

Спасибо.

вот код, который я пытаюсь заставить работать

void setup() {
// физический контакт 2=TX 3=RX
  Serial.begin(9600);
  pinMode(3, OUTPUT);      // устанавливаем вывод светодиода в качестве выхода
  digitalWrite(3, LOW);    // вывод светодиода выключения
}

void loop() {
  
  if (Serial.available()) {
  // char data_rcvd = Serial.read(); // прочитать один байт из последовательного буфера и сохранить в data_rcvd

    int data_rcvd = Serial.read() << 7;     // получить более высокие 7 бит
    int data_rcvd += Serial.read() & 0x7F;  // получаем и добавляем младшие 7 бит




    if (data_rcvd == 1500) digitalWrite(3, HIGH); // включить светодиод
    if (data_rcvd == '0') digitalWrite(3, LOW);  // выключаем светодиод
  }

// if (digitalRead(8) == HIGH) Serial.write('0'); // отправить символ '0' в последовательный порт, если кнопка не нажата.
// иначе Serial.write('1'); // отправить символ '1' в последовательный порт, если кнопка нажата.

}

, 👍-2

Обсуждение

Пожалуйста, покажите нам полный код, а не только фрагменты. Где определены эти функции?, @chrisl

я удалил второй int для data_rcvd и код скомпилировался но не включил светодиод, @benjamin nikkel

не уверен, имеет ли это значение, но я использую attiny412, @benjamin nikkel

Ваш код не содержит никаких вызовов fdserial_rxChar() или подобных. Так в чем ваша настоящая проблема? Вы не получите хороших ответов, если не зададите понятный и полный вопрос, @chrisl

я отправляю значение 1500... что это значит? ... вы отправляете целое число? ... вы отправляете текст? ... что-то другое?, @jsotola


2 ответа


1

У вас есть несколько очевидных проблем.


if (Serial.available()) {
 int data_rcvd = Serial.read() << 7;     // получить более высокие 7 бит
 int data_rcvd += Serial.read() & 0x7F;  // получаем и добавляем младшие 7 бит

Вы проверяете, доступен ли один байт на последовательном порту, а затем читаете два байта. Слишком рано. Проверьте два байта, если вы планируете прочитать два.


if (data_rcvd == '0') digitalWrite(3, LOW);  // выключаем светодиод

Почему кавычки? Почему бы и нет: if (data_rcvd == 0) ?


Как вы собираетесь синхронизировать отправку и получение?

Ваш отправитель отправляет HLHLHLHL. Что, если получатель запустится во время отправки младшего байта? Вы получите LHLHLH, что означает, что ваши полученные данные будут бессмысленными.

Лучше отправить "удобочитаемый" данные, например "1500" а не 1500, заканчивая новой строкой и структурируя ваш код приема так, чтобы он читался до тех пор, пока он не встретит новую строку. Это синхронизирует приемник (во всяком случае, после первого чтения).


Дополнительные советы по чтению последовательных данных см. в статье Как работает последовательная связь на Arduino?

Кроме того, в мой пост о последовательных данных на моем форуме есть код для буферизации входящих последовательных данных и ожидания перехода на новую строку.

,

спасибо за вашу помощь Ник, вы направили меня к поиску моего ответа. есть ли способ заставить arduino приостановить/подождать, пока он не получит определенное значение, например 129/0x81? вроде как способ синхронизировать вещи?, @benjamin nikkel

@benjaminnikkel Самое простое решение — это то, что я предложил в своем ответе. Отправьте «строку» данных, включая новую строку в конце. Новая строка будет отделять каждое чтение от следующего. Вместо того, чтобы передавать младшие и старшие байты, просто выполните sprintf в буфер, превратив число в символы ASCII, и добавьте новую строку в конец. Arduino может прочитать строку данных. Советы см. в [мой пост о чтении последовательных данных](http://www.gammon.com.au/serial). Однако ссылка на моем собственном форуме содержит более подробную информацию о чтении строк данных., @Nick Gammon


1

ответ на мой вопрос о том, как писать

servo1  = fdserial_rxChar(receive) << 7;    // получаем старшие 7 бит
servo1 += fdserial_rxChar(receive) & 0x7F;  // получаем и добавляем младшие 7 бит

чтобы Arduino скомпилировал его....

combined = (val1 << 7) | (val2);
,