Невозможно получить данные с последовательного устройства с помощью Arduino

#serial-port #arduino #sensors

#последовательный порт #arduino #датчики

Вопрос:

Я пытаюсь считывать данные с ультразвукового датчика топлива (ссылка).Скорость передачи данных этого устройства составляет 9600.Устройство в основном отправляет данные через регулярные промежутки времени.Я могу считывать выходные данные на ПК с помощью программного обеспечения терминала.Ниже приведен пример.

Например: * XD, 205B,00,0000,0031,0000,0000, нулевой#

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

5320215115451166102572432302302432302302302302432303816623024323023023023024323023023023051822281141463

 String incoming_char;      // Will hold the incoming character from the Serial Port.

void setup()
{
  //Initialize serial ports for communication.
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial.println("Starting Communication with Fuel Sensor");
}
void loop()
{

 //If a character comes in from the cellular module...

  if(Serial1.available() >0)
  {
    incoming_char=String(Serial1.read());    // Get the character from the cellular serial port.
    Serial.print(incoming_char);  // Print the incoming character to the terminal.
  }
}
  

Arduino питается от USB, а устройство — от источника питания 12 В.
Уровни напряжения от устройства Tx-GND =-5,44 В, Rx-GND =-8,22 В.

Сначала я подумал, что проблема может быть из-за диапазона напряжений, и создал схему делителя напряжения и подал Arduino пропорциональное напряжение.Даже это не работает. Итак, что происходит не так?Пожалуйста, направьте меня.

Комментарии:

1. Вы путаете ASCII и двоичные данные. Что- то отображает символы в строке как целые числа вместо символов.

2. Я, Ханс, переключился на Serial.write, и теперь он печатает ненужные символы. По-видимому, этот набор символов преобразуется в числа.

Ответ №1:

Поскольку вы используете Serial1, я предполагаю, что вы используете Arduino Mega?

Из вашего вопроса я бы сказал, что проблема не в напряжении и т. Д., А, скорее всего, в том, как вы считываете данные. Вы предполагаете, что датчик будет возвращать значения символов. Существуют ли какие-либо спецификации того, что возвращается?

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

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

Комментарии:

1. Привет, ГолгиДеванг, я использую Arduino Mega 2560. На самом деле, в спецификации указано, что он использует ASCII и имеет формат «(* XD, efgh, ij, klmn, abcd, opqr, stuv, wxyz #).

2. Хорошо, я прав, думая, что вы используете Serial для связи с вашим ЖК-дисплеем? Вы пробовали печатать что-то жестко закодированное на экране. Также я замечаю, что описание датчика имеет два выхода RS232 и аналоговый. Оба вывода выводятся одновременно или есть переключатель? Вы проводили тестирование на своем ПК с использованием RS232 с разъемом DB9?

3. Привет, ГолгиДеванг, я просто использую последовательный интерфейс, поскольку требуемые данные отображаются только на последовательном выходе. Я провел тест с разъемом DB9, и он показал мне выходные данные. Кажется, теперь проблема решена. Спасибо за ваши отзывы.

Ответ №2:

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

Комментарии:

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

2. о, хорошо, мне жаль, что я не могу вам помочь. Я относительно новичок в этом. извините, я не смог больше помочь, надеюсь, ваш проект пройдет хорошо

3. Нет проблем с пользователем 3792207.. Даже я новичок в этом. Кажется, я преодолел одно препятствие. Надеюсь, это также коснется и других. Спасибо за ваши отзывы.

Ответ №3:

Это просто дикое предположение, поскольку у меня нет Arduino Mega (у меня есть Duemilanove и Uno), но я работал над проектами, в которых я сталкивался с проблемами, похожими на то, что у вас есть. Иногда добавление a delay() в ваш void loop() блок помогает и дает arduino достаточно времени для чтения байтов из буфера. Для скорости передачи данных 9600 бод обычно требуется около 1 мс для чтения 1 байта, поэтому необходимо добавить задержку.

 void loop()
{

 //If a character comes in from the cellular module...

  if(Serial1.available() >0)
  {
    incoming_char=String(Serial1.read());    // Get the character from the cellular serial port.
    Serial.print(incoming_char);  // Print the incoming character to the terminal.
  }
  delay(100);
}
  

Комментарии:

1. Привет, ГРИММ .. Спасибо за ваши отзывы.

Ответ №4:

Спасибо вам всем! для ваших значений.Проблема заключалась в том, что я пытался подключить последовательный интерфейс RS232 (работает с отрицательными напряжениями) к последовательному интерфейсу TTL (работает от 0 до некоторых положительных напряжений), используемому в Arduino. По-видимому, я подавал отрицательные напряжения на Arduino, тогда как ожидалось, что он будет давать положительные напряжения. Итак, получил разъем RS232-TTL, и он, наконец, заработал.