Связь с Arduino и электронным устройством(например, телевизором или компьютером) через кабель rs 232

Допустим, в какое-то электронное устройство (телевизор ИЛИ компьютер) встроена программа. В зависимости от полученных данных от Ardiuno, он отображает некоторый текст в зависимости от требований. Например, если он получает 1, он должен отображать "ошибка", иначе, если он получает 0, он должен отображать "готово".

Я работаю только над отправкой сигналов/байтов с Arduino Uno на какое-то устройство, на котором уже есть встроенная программа. Я просто хочу отправить 0 или 1 байт с Ardiuno на устройство, используя TTL для покрытия RS 232. это и есть код

#include<SoftwareSerial.h>

 #define rxPin 0 //make pin o as rx pin 

 #define txPin 1//make pin 1 as tx pin

 SoftwareSerial mySerial(rxPin ,txPin);//i donot undersatnd this line (i got 
 the code from net//

 void setup() 

 {

     pinMode(rxPin,INPUT);//making rx as input//
     pinMode(txPin,OUTPUT);//making tx as output//
     Serial.begin(9600);
     mySerial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:
Serial.print(0x00);//i want to send 0 byte data from ardinuo to device //
delay(200);
}

Я использую программное обеспечение RealTerm, чтобы проверить, принимаются ли сигналы, которые я отправил с Arduino Uno, так, как они должны быть (без каких-либо помех). Serial monitor output RealTerm software output

В этом случае я непрерывно отправляю 0 из ardinuo в realterm(для целей тестирования). Я получаю в реальном времени в шестнадцатеричном формате. Поскольку я непрерывно отправляю 0, я также должен получать непрерывный вывод 0 в реальном времени. Вместо этого я сначала получаю некоторые случайные значения (при загрузке скетча), а RealTerm вскоре перестает отображать вывод.

Может кто-нибудь, пожалуйста, помочь мне решить мою проблему.

Обновление 1: я изменил свой код в соответствии с предложением @chrisl. Теперь, когда я отправляю 0 ,я получаю правильный ответ, но когда я отправляю 1 непрерывно, я получаю много 0 и случайных значений

#include<SoftwareSerial.h>
#define rxPin 2 
#define txPin 3
SoftwareSerial mySerial(rxPin ,txPin);
void setup() 
 {
 pinMode(rxPin,INPUT);
  pinMode(txPin,OUTPUT);
  Serial.begin(9600);
  mySerial.begin(9600);
  }

  void loop() {
     // put your main code here, to run repeatedly:
  Serial.print(0x01);//i want to send 1 byte data from ardinuo to 
  device(realterm)
  delay(200);
   }

output whn sending 1 from ardinuo

, 👍-1

Обсуждение

RealTerm, похоже, отображает шестнадцатеричные значения. Поскольку вы отправляете ASCII - код для "0" (то есть 30) (используя "print () "вместо" write ()"), вы должны увидеть там повторяющееся 30. Не принимайте нули, когда вы отправляете ASCII. Хотя это не объясняет кажущиеся случайными значения, которые вы получаете., @chrisl

Вы настроили контакты 0 и 1 Uno для последовательного программного обеспечения, что не имеет смысла, поскольку эти контакты имеют последовательный аппаратный. Тогда вы даже не используете программный серийный номер в своем коде. Вам нужно потратить время, чтобы действительно понять, что делает код, а не просто случайным образом копировать вставку и надеяться, что это может сработать. Вам доступна тонна информации, используйте ее!, @per1234

используйте Serial.write(0), а не Serial.print(0), если вы хотите отправить значение 0, а не символ '0'., @Juraj


1 ответ


0

У вас есть 2 проблемы:

  1. Вы используете функцию Serial.print (), которая выводит символы в кодировке ASCII. При отправке "0" таким образом на самом деле будет отправлено значение 48 (или 30 в шестнадцатеричном формате). RealTerm, похоже, отображает шестнадцатеричные значения, так что вы получите длинную серию "30". На самом деле это не большая проблема, вы только не должны ожидать, что нули будут отображаться там с помощью этого кода. Вы можете использовать функцию Serial.write() для отправки прямых байтовых значений вместо кодов ASCII.
  2. Вы запускаете программный файл на тех же выводах, которые зарезервированы для последовательного подключения оборудования. Это не может работать должным образом, потому что обе библиотеки будут пытаться использовать одни и те же контакты. Выберите другие контакты для Rx и Tx интерфейса SoftwareSerial.

ИЗМЕНИТЬ:

Также вы устанавливаете режимы вывода для Rx и Tx программного обеспечения. Я не знаю, может ли это вызвать проблему, но, по крайней мере, вам не нужно этого делать. Библиотека будет правильно устанавливать контакты.

EDIT2: Дополнительное объяснение двоичного, шестнадцатеричного и ASCII-представления последовательного байтового потока

Существуют различные методы отображения потока байтовых данных (например, потока из вашего последовательного интерфейса). Давайте посмотрим на десятичное значение (то, которое вы используете при вызове арифметических операций, таких как+, -) 48. Это разное представление этого числа в разных системах счисления (первые два символа обозначают систему счисления; 0b для двоичной, 0x для шестнадцатеричной):

  • двоичный код: 0b00110000
  • шестнадцатеричный: 0x30

Существует больше систем счисления, но это самые важные из них. Но поток байтов также можно использовать для того, чтобы он выглядел как последовательность символов. Для этого стандарт ASCII родился давным-давно. В простом ASCII каждое значение от 0 до 127 присваивается символу или управляющему действию. Программа терминала считывает поток байтов и отображает соответствующие символы в соответствии с таблицей ASCII. В этой модели есть расширения для отображения большего количества возможных символов, но это самый основной принцип. С его помощью вы можете фактически отправлять читаемый человеком текст с вашего Arduino на другое устройство.

Функция Serial.print() предназначена для этого читаемого человеком текста, поэтому она отправит ASCII-представление входного параметра. Значение ASCII символа "0" равно 48, что соответствует шестнадцатеричному значению 30.

Теперь я не уверен, показывает ли ваша терминальная программа шестнадцатеричные или ASCII-значения. Я подумал о первом, потому что все символы на вашем первом изображении являются цифрами или символами от A до F, что является диапазоном шестнадцатеричных значений. Казалось маловероятным, что он не получит других символов, когда у вас есть текст в кодировке ASCII со случайными значениями. Но в настоящее время я не уверен, будет ли функция Serial.print() автоматически печатать шестнадцатеричное представление в виде текста ASCII, если задано шестнадцатеричное значение (я так не думаю, но это может быть возможно). Пожалуйста, попробуйте использовать функцию Serial.write() и попробуйте отправить другое значение во время просмотра вывода RealTerm.

И, пожалуйста, найдите настройки, которые определяют, как интерпретируется полученный поток байтов. Это прояснило бы, что здесь делает RealTerm. Также убедитесь, что вы понимаете связь между двоичным значением и символом ASCII. Если это все еще недостаточно ясно, вы можете поискать в Google подробные объяснения. На эту тему есть множество учебных пособий.

,

я обновил вопрос, пожалуйста, проверьте, @jalath

как ваше предложение ,я последовал шагу 2, так что теперь я могу получать непрерывный вывод, я не могу понять 1-ю часть вашего ответа, @jalath

@jalath Я добавил дополнительные объяснения., @chrisl

Согласно основным принципам последовательной связи, передатчик (Tx) Arduino должен быть подключен к приемнику (Rx) устройства. Однако я получаю правильный вывод, когда подключаю передатчик Arduino к контакту передатчика устройства. Почему это так?, @jalath

Возможно, информация о контактах на вашем устройстве неверна. Вы не уточнили, что у вас там есть. Или преобразователь TTL RS232 уже может скрутить эти две линии. Из приведенной информации нельзя сказать, @chrisl