Передача данных по UART

Glinka0
Offline
Зарегистрирован: 13.03.2017

Доброго времени суток.Пытаюсь передать данные с одной ардуины на другую

Передатчик:(передаёт вроде-бы нормально,выдаёт в сериал верные данные)

volatile int RPM=0;
volatile unsigned long lastflash=0;
void setup() {
  Serial.begin(9600);
  attachInterrupt(1,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
  pinMode(2, OUTPUT);   
  digitalWrite(2, HIGH);  
}
void sens() {
  
 RPM=30000000/(micros()-lastflash);  //расчет
  lastflash=micros();  //запомнить время последнего оборота
}

void loop() {
  if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
    RPM=0;  //считаем что RPM 0
  }
  
   Serial.println(RPM);
   //вывод в порт
 
}

Приёмник:(Не принимает данные, например, при передаче нуля получаются различные двухзначные данные, почему?)

void RPM(){    //получает данные об оборотах двигателя по uart и выводит
      if(Serial.available()>0){
   
   Serial.println(int (Serial.read())); //смотрим показания на экране
}
}
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы понимаете, что передаёте в текстовом виде, а принимаете во внутреннем - машинном? Если понимаете и при этом считаете, что что-то не так, публикуйте

1) скетчи полнстью, а не кусочно
2) лог из сериал-монитора

b707
Offline
Зарегистрирован: 26.05.2017

Glinka0 пишет:

Приёмник:(Не принимает данные, например, при передаче нуля получаются различные двухзначные данные, почему?)

"Различные" двухзначные данные приниматься не должны, при отправке нуля вашим кодом всегда должно приниматься хначение 48. Почему - вам Евгений выше обьяснил.

Glinka0
Offline
Зарегистрирован: 13.03.2017

Спасибо,разобрался в передаче бинарного кода,сначала не понял ,как выцепить из потока байтов нужное число,потом наткнулся на parceInt() ,теперь всё работает.Пока разбирался спалил ардуинку,код загруженный на неё ранее работает,а прошиваться не хочет(

Передатчик :

volatile int RPM=0;
volatile unsigned long lastflash=0;
unsigned long UART=0;
void setup() {
  Serial.begin(9600);
  attachInterrupt(1,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
  pinMode(2, OUTPUT);   
  digitalWrite(2, HIGH);  
}
void sens() {
  
 RPM=(30000000/(micros()-lastflash))/50*50;  //расчет
  lastflash=micros();  //запомнить время последнего оборота
}

void loop() {
  if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
    RPM=0;  //считаем что RPM 0
  }
  if ((millis()-UART) >=500){
   if (RPM>0){
   Serial.println(RPM);
   }
 
     UART=millis();
  }

Приёмник:

void RPM(){    //получает данные об оборотах двигатля по uart и выводит
      if(Serial.available()>0){
  
 int RPM=Serial.parseInt();
       if (RPM > 0){
  Serial.println(RPM);
 }
   else {
    RPM=0;
    Serial.println(RPM);
   }
      }

 

b707
Offline
Зарегистрирован: 26.05.2017

Glinka0, вот что заинтересовало в вашем коде  - в приемнике вы читаете RPM из сериала и потом обратно в сериал же его и отправляете. Зачем?

Glinka0
Offline
Зарегистрирован: 13.03.2017

Отправляю на экран компа для отладки,позже это будет выводится на TFT экран

b707
Offline
Зарегистрирован: 26.05.2017

Glinka0 пишет:

Отправляю на экран компа для отладки,позже это будет выводится на TFT экран

у вас один и тот же сериал подключен и к передатчику и к монитору компа?

Glinka0
Offline
Зарегистрирован: 13.03.2017

Передатчик висит на выводах RX TX ,приёмник отправляет по проводу в комп.Данные не смешиваются,если ты про это.

b707
Offline
Зарегистрирован: 26.05.2017

Glinka0 пишет:

Передатчик висит на выводах RX TX ,приёмник отправляет по проводу в комп.Данные не смешиваются,если ты про это.

А плата(ардуина) какая?

Glinka0
Offline
Зарегистрирован: 13.03.2017

NANO

b707
Offline
Зарегистрирован: 26.05.2017

Glinka0 пишет:

Передатчик висит на выводах RX TX ,приёмник отправляет по проводу в комп.Данные не смешиваются,если ты про это.

Удивительно :)

А ты в курсе, что "выводы RX TX" и "провод в комп" - на Нане это одно и то же ? :) Данные не могут не смешиваться и что ты там принимаешь или отправляешь - черт не разберет...

Для того, чтоб реально протестировать, перевесь передатчик на софтовый сериал на любые другие пины, кроме 0 и1.

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

 

Glinka0
Offline
Зарегистрирован: 13.03.2017

Наверное ты прав,но мне всё-равно,т.к. в основной программе данные будут выводится на TFT экран

Glinka0
Offline
Зарегистрирован: 13.03.2017

b707 пишет:

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

 

[/quote]

Так,а что сгорело?Программатор?

b707
Offline
Зарегистрирован: 26.05.2017

Glinka0 пишет:

[

Так,а что сгорело?Программатор?

скорее всего ничего не сгорело, просто загрузчик в нане слетел.