Неправильные данные, полученные при последовательной связи

У меня есть две Arduino UNO, соединенные двумя проводами и землей, которые обмениваются информацией через последовательные данные. Связь работает с INT, но у меня возникают проблемы с получением правильных символов. Вместо символов я получаю только числа.

Я перепробовал все возможные комбинации Serial.write() или Serial.println() с HEX и ASCII, но это не сработало.

Я не знаю, что я делаю неправильно, если кто-нибудь может мне помочь, я буду признателен.

Передатчик:

#include <SoftwareSerial.h>
#define TX 2
#define RX 3
#define ask 3
#define ER_LED 12

String dataline = "605030";
const byte code = 60;

SoftwareSerial syserial(RX, TX); // прием, передача

void setup() {
  // поместите сюда код установки для однократного запуска:
  syserial.begin(57600);
  Serial.begin(57600);
}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:
  //syserial.println(dataline); //НЕТ
  //syserial.println(28, DEC); // хорошо для чисел
  
  Serial.println(dataline.length());
  for (int i = 0; i < dataline.length(); i++)
  {
    syserial.print((char)dataline[i]);
  }
  syserial.println();
  //syserial.write(234);
  //syserial.print('<');
  delay(4000);
}

Получатель:

#include <SoftwareSerial.h>
#define TX 2
#define RX 3
const byte ask = 3;
bool com_end;
#define ER_LED 7
#define AC_LED 5


SoftwareSerial syserial(RX, TX); // прием, передача

void setup() {
  // поместите сюда код установки для однократного запуска:
  syserial.begin(57600);
  Serial.begin(57600);
}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:
  while (syserial.available())
  {
    Serial.println(syserial.read());
  }
  delay(100);
}

Последовательный монитор на какой-нибудь б/с:

21:19:36.408 -> 253
21:19:36.408 -> 255
21:19:40.421 -> 253
21:19:40.421 -> 255
21:19:44.495 -> 253
21:19:44.495 -> 255

Монитор с SySerial на скорости 57 600 бит/с:

21:23:29.317 -> 241
21:23:33.308 -> 241
21:23:37.338 -> 241
21:23:41.328 -> 241

Мониторинг с помощью SySerial на скорости 300 бит/с:

21:27:03.444 -> 255
21:27:07.731 -> 255
21:27:12.095 -> 255
21:27:16.335 -> 255
21:27:20.635 -> 255

Обновление:

Я изменил контакты на UNO (TX -> 2) (RX -> 3), и теперь я снова получаю другие номера. Должно быть, я делаю что-то плохое, но не могу понять что.

, 👍1

Обсуждение

Я получаю разные числа вместо символов, @BruceWawe

пожалуйста, откройте содержимое окна серийного монитора и вставьте его в свой пост... отформатируйте как код... пожалуйста, **без** картинок, @jsotola

Да, но они не отображаются как персонажи, @BruceWawe

Какие числа вы получаете при скорости 9600 бит/с?, @Edgar Bonet

Обновлен код с выводом на монитор, @BruceWawe

Контакты 0 и 1 на Uno предназначены для серийного номера HW. Возможно, если вы использовали контакты 3 и 4 для software serial, он может работать как задумано., @VE7JRO

Поменял, не работает. у меня были контакты 2 и 3, @BruceWawe

Меняешь провода? т.е. RX на одном Uno для TX на другом. Попробуйте использовать более низкую скорость передачи данных для software serial, 57600, вероятно, подталкивает ее., @Nick Gammon

Привет, спасибо за ваш ответ. Замена проводов ничего не дает на мониторе, поэтому я думаю, что провода в правильном положении. Я пытался использовать как «300 бит/с», так и «9600 бит/с» для «syserial», но он меняет только несколько чисел (_52 для 300 бит/с, дает 53 для 9600 бит/с_). Кажется, что числа меняются, когда я использую разные скорости передачи данных, @BruceWawe

У вас нет под рукой осциллографа или логического анализатора, чтобы _измерять_, а не _угадывать_?, @the busybee

@the busybee У меня нет ни осциллографов, ни логических анализаторов. Я бы попробовал с ними, если бы мог., @BruceWawe

Хорошо, тогда перепроверьте каждый компонент SW/HW и делайте маленькие шаги: например, проверяйте с помощью локальной петли, что у вас есть правильные контакты и программное обеспечение, передавайте отдельные байты четких шаблонов (от 0x01 до 0x80) с достаточным интервалом. , и так далее. Всегда довольно сложно заниматься разработкой без соответствующих инструментов., @the busybee

Что вы имеете в виду под каждым компонентом "SW/HW""? На данный момент я проверял соответствие пинов, пробовал использовать разные пины и пробовал стандартные коды, которые смог найти в сети, но пока безрезультатно..., @BruceWawe

Правильно, пины, которые вы используете, функции, которые вы вызываете, параметры этих функций. Вы пробовали предложения? Пожалуйста, добавьте новую информацию к вашему вопросу, [изменив] его., @the busybee

Вместо этого я бы попробовал использовать аппаратные последовательные порты. И да: приемник может использовать аппаратный порт как для приема от другого Arduino, так и для отправки на последовательный монитор., @Edgar Bonet


1 ответ


Лучший ответ:

0

Связь работает с INT, но у меня возникают проблемы с получением правильных символов. Вместо символов я получаю только числа.

Предлагаю вам сделать шаг назад, потому что ваш код не был обновлен в соответствии с тем, что вы указали в последующих комментариях, и быстро становится менее понятно, что происходит.

На каждом UNO используйте контакты 2,3 и GND. Не подключайте ничего другого к UNO.

UNO ONE контакт 2 соединяется с UNO TWO контакт 3

UNO ОДИН контакт 3 соединяется с UNO ДВА контакта 2

UNO ONE GND на UNO TWO GND

на UNO ONE запустите этот код:

// ПОЛУЧАТЕЛЬ
#include <SoftwareSerial.h>
SoftwareSerial SSerial(2,3); // прием, передача
void setup() {  
  Serial.begin(9600); // Аппаратное обеспечение монитора Arduino Serial
  SSerial.begin(9600);
}
void loop() { 
  // отображать все, что приходит по серийному номеру программного обеспечения, на монитор Arduino (последовательный аппаратный)
  if (SSerial.available()) {
    Serial.write(SSerial.read());
  }
}

на UNO TWO запустите этот код

// ОТПРАВИТЕЛЬ
    #include <SoftwareSerial.h>
    SoftwareSerial SSerial(2, 3); // прием, передача
    void setup() {
      SSerial.begin(9600);
    }
    void loop() {
      SSerial.println("Simple Arduino SoftwareSerial Test");
      delay(1000);
    }

Откройте последовательный монитор на UNO ONE, и вы увидите "Simple Arduino SoftwareSerial Test" печатается каждую секунду.

Если вы не можете зайти так далеко, у вас другая проблема.

Вы используете два UNO на двух разных компьютерах? Вы используете два UNO на одном компьютере, то есть; запуск двух экземпляров IDE (может зависеть от ОС - я постоянно так делаю на Win 7, но не знаю о других ОС)?

Посмотрите, сможете ли вы сделать это первым, и я думаю, что будет легче исправить остальное.

,

Спасибо за ответ, настройка, которую вы дали, похоже, работает, я попытаюсь понять, что было не так в моем предыдущем коде..., @BruceWawe