#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, и он, наконец, заработал.