Связь с 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, так, как они должны быть (без каких-либо помех).
В этом случае я непрерывно отправляю 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);
}
@jalath, 👍-1
Обсуждение1 ответ
У вас есть 2 проблемы:
- Вы используете функцию
Serial.print ()
, которая выводит символы в кодировке ASCII. При отправке "0" таким образом на самом делебудет отправлено значение 48
(или30
в шестнадцатеричном формате). RealTerm, похоже, отображает шестнадцатеричные значения, так что вы получите длинную серию "30". На самом деле это не большая проблема, вы только не должны ожидать, что нули будут отображаться там с помощью этого кода. Вы можете использовать функциюSerial.write()
для отправки прямых байтовых значений вместо кодов ASCII. - Вы запускаете программный файл на тех же выводах, которые зарезервированы для последовательного подключения оборудования. Это не может работать должным образом, потому что обе библиотеки будут пытаться использовать одни и те же контакты. Выберите другие контакты для 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
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Как читать и записывать на устройство rs232 с/на Arduino
- Считывание серийного номера с заголовком и конечным маркером
- Взаимодействие с контроллером температуры Eurotherm 2416 через Modbus RS232
- Использование Arduino для чтения и записи данных на устройство RS232
- Подключите Arduino к ПЛК (обмен данными)
- Искаженный серийный номер устройства GPS
- Аналоговое считывание манометра через RS232
RealTerm, похоже, отображает шестнадцатеричные значения. Поскольку вы отправляете ASCII - код для "0" (то есть 30) (используя "print () "вместо" write ()"), вы должны увидеть там повторяющееся
30
. Не принимайте нули, когда вы отправляете ASCII. Хотя это не объясняет кажущиеся случайными значения, которые вы получаете., @chrislВы настроили контакты 0 и 1 Uno для последовательного программного обеспечения, что не имеет смысла, поскольку эти контакты имеют последовательный аппаратный. Тогда вы даже не используете программный серийный номер в своем коде. Вам нужно потратить время, чтобы действительно понять, что делает код, а не просто случайным образом копировать вставку и надеяться, что это может сработать. Вам доступна тонна информации, используйте ее!, @per1234
используйте Serial.write(0), а не Serial.print(0), если вы хотите отправить значение 0, а не символ '0'., @Juraj