Как связаться с датчиком через порты RX/TX Arduino?

У меня есть датчик, который обменивается данными через последовательную связь. Датчики CTi TILT-05. Он передает строку ASCII с данными, разделенными запятыми. Я хочу иметь возможность читать входящие данные ASCII в последовательном мониторе Arduino IDE в режиме реального времени (устройство представляет собой акселерометр).

Я изо всех сил пытаюсь передать это в коде. В настоящее время у меня есть RX датчика, подключенный к порту TX Arduino Uno (цифровой 1) и датчик TX-> Arduino RX (цифровой 0). Датчик питается и заземляется через Arduino.

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

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

, 👍2


2 ответа


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

1

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

Во-первых, то, как вы сейчас подключаете датчик, должно просто передавать информацию в последовательный монитор Arduino IDE без какого-либо кода на Arduino.

Какова скорость передачи данных и каким образом последовательный порт выходит из датчика?

Если вы хотите интерпретировать данные по мере их поступления, вам следует использовать последовательное программное обеспечение, поскольку вы не можете передавать информацию на ПК с помощью линий RX TX Arduino, подключенных к чему-то другому.

Что вы можете сделать, описано ниже (Непроверено):

#include <SoftwareSerial.h>

SoftwareSerial mySer(3, 4); //Прием TX

//это символьная область, потому что она из Serial
char accel[3] = {'0'};
uint8_t place = 0;

// массив для печати синхронно с массивом значений акселерометра
const char* SerialText[3] = {
   "\nX Axis: ",
   "\nY Axis: ",
   "\nZ Axis: ",
};


char inData = '0';
char separator = ','; // разделитель, который вы описали



void setup(){
//устанавливаем нормальную скорость, мой для примера
     Serial.begin(9600); 

     mySer.begin(9600);

}//~ завершение настройки

void loop(){

    if(mySer.available()){

     inData = mySer.read(); // получаем значение в момент наличия последовательных данных

        if(inData != separator){
          accel[place] = inData;
          Serial.print(SerialText[place]); // распечатываем идентификатор текущих значений
          Serial.print(accel[place]); // печатаем значение
          place++; // увеличиваем для следующего раза
     }
   }

if(place >= 3) place = 0;
}//~ конец цикла

Вышеприведенный результат дает этот вывод на данный момент с вводом $CSACC,-0156.4,-0226.3,+0981.2*49

X Axis: $
Y Axis: C
Z Axis: S
X Axis: A
Y Axis: C
Z Axis: C
X Axis:  
Y Axis: -
Z Axis:  
X Axis: 0
Y Axis: 1
Z Axis: 5
X Axis: 6
Y Axis: .
Z Axis: 4
X Axis:  
Y Axis: -
Z Axis:  
X Axis: 0
Y Axis: 2
Z Axis: 2
X Axis: 6
Y Axis: .
Z Axis: 3
X Axis: +
Y Axis: 0
Z Axis: 9
X Axis: 8
Y Axis: 1
Z Axis: .
X Axis: 2
Y Axis: *
Z Axis: 4
X Axis: 9
Y Axis:  
Z Axis: 
X Axis: 

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

,

Есть и другие способы, но я добавлю некоторую информацию позже, если понадобится, или после разъяснений ОП., @RSM

Привет! Большое спасибо за попытку помочь. Для пояснения: это датчик, который я пытаюсь использовать: http://ctisensors.com/wp-content/uploads/2016/03/TILT-05-Datasheet-01b.pdf. Он передает строку ASCII со скоростью 115200 бод. Я пробовал ваш код, но обнаружил несколько ошибок, в первую очередь: ошибка: массив должен быть инициализирован с помощью инициализатора, заключенного в фигурные скобки. символ ускорения [3] = 0;, @F Young

@FYoung спасибо за информацию о датчике, я исправлю свой ответ, а также исправлю ошибку в коде., @RSM

В качестве примечания: поскольку устройство использует NMEA 0183, вот ссылка на способ [хорошо разделить его](http://kingtidesailing.blogspot.co.za/2015/09/how-to-connect-any-nmea). -0183-device-to.html), @RSM


0

С помощью RSM мне удалось полунадежно передать показания датчика на последовательный монитор. Мне еще предстоит припаять разъемы к датчику, и я просто занимаюсь прототипированием (по сути, я просто прижимаю провод к выходному отверстию датчика), что ненадежно. Я считаю, что как только я припаю несколько разъемов к выходу, выход станет намного надежнее. Для тех, кто ищет, этот код мне помог.

Цифровые контакты 3/4 функционируют как контакты RX/TX соответственно. Подключите TX вашего датчика к RX (3) Arduino и аналогично для TX. Я использовал скорость передачи данных 115200 бод, но вы можете изменить ее на любую, которая работает в коде. Это просто упрощение кода RSM из его предыдущего ответа, и все похвалы и похвалы принадлежат ему.

#include <SoftwareSerial.h>

SoftwareSerial mySer(3, 4);

char inData = '0';

void setup(){
     Serial.begin(115200); 
      mySer.begin(115200);
}

void loop(){
    if(mySer.available()){
     inData = mySer.read(); 
     Serial.print(inData);
  }
}
,