Передача данных

Nokia
Offline
Зарегистрирован: 09.03.2014

Здравствуйте в данный момент пытаюсь реализовать передачу данных с ардуино на ардуино по портам Rx и  Tx.  Я передаю 3 значения первое 30.21230 второе 59.76884 и третье 360. Проблема заключается в том что он выводит мне не корректно данные т.е. первое число 30.0000 второе 59.000 а третье там совсем не 360.

Вот скетч передачи данных:

#include <SoftwareSerial.h>

SoftwareSerial  qwe (9,8);

int n,m,i,j,c;
char A[3];
long B[15];
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  Serial.begin(9600);
  qwe.begin(9600);
  
}

// the loop routine runs over and over again forever:
void loop() {
  for (i=0;i<3;i++){
    if (i%3==0)
    {
      
      A[i]=30.21230;

    //  sprintf( A, n)
     // n++;
      qwe.write(A[i]);
    }
    else if (i%3==1)
    {
     A[i]=59,76884;
   //   m++;
      qwe.write(A[i]);
    } else{
         A[i]=130;
         qwe.write(A[i]);
          }
                    //  Serial.println(A[i]);
   //   char bytes[3]={ n, m, c};  
     // qwe.write(bytes);
     // qwe.println(bytes);
    }
    delay(1000);
  }

 

Вот скетч приема данных:
#include <SoftwareSerial.h>

SoftwareSerial  qwe (9,8);

int n,m,i,j;
double A[3];
int B[15];
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  Serial.begin(9600);
  qwe.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  while(qwe.available()>0)
 { 
   A[i]=qwe.read();
   // B[i]=qwe.read();
   i++;
   if (i>=3) break;
 }
 //////////////////////////////////////////
 for (m=0;m<3;m++)
 {
   if (B[m]==A[m])break;
 }


 ////////////////////////////////////
 for (j=0;j<3;j++)
 {
   B[j]=A[j];
 }
  if(i>0){
    for (n=0;n<i;n++)
    Serial.println(A[n]);
    B[n]=A[n];
//    Serial.println(B[n]);
    //Serial.println("");
    i=0;
  }}

 

 

Echo free
Offline
Зарегистрирован: 10.03.2014

Nokia пишет:

Здравствуйте в данный момент пытаюсь реализовать передачу данных с ардуино на ардуино по портам Rx и  Tx.  Я передаю 3 значения первое 30.21230 второе 59.76884 и третье 360. Проблема заключается в том что он выводит мне не корректно данные т.е. первое число 30.0000 второе 59.000 а третье там совсем не 360.

char A[3];      A[i]=30.21230;      A[i]=59,76884;

эта программа не встречалась с компилятором :-)

1. Исправьте синтаксис (, .)  и приведите в соответствие объявленный char используемый как  float тип данных

2. При передаче данных размером >= 2 байта (int long float) учитывайте порядок байтов

 

Nokia
Offline
Зарегистрирован: 09.03.2014

Вот передаю данные с одной ардуино 

#include <SoftwareSerial.h>
 
SoftwareSerial  qwe (9,8);
 
int n,m,i,j,c;
float A[3];
long B[15];
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  Serial.begin(9600);
  qwe.begin(9600);
  
}
 
// the loop routine runs over and over again forever:
void loop() {
  for (i=0;i<3;i++){
    if (i%3==0)
    {
      
      A[i]=30.21230;
 
    //  sprintf( A, n)
     // n++;
      qwe.write(A[i]);
    }
    else if (i%3==1)
    {
     A[i]=59.76884;
   //   m++;
      qwe.write(A[i]);
    } else{
         A[i]=130;
         qwe.write(A[i]);
          }
                    //  Serial.println(A[i]);
   //   char bytes[3]={ n, m, c};  
     // qwe.write(bytes);
     // qwe.println(bytes);
    }
    delay(1000);
  }
 
Вот принимаю данные на другой ардуино
#include <SoftwareSerial.h>
 
SoftwareSerial  qwe (9,8);
 
int n,m,i,j;
float A[3];
int B[15];
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  Serial.begin(9600);
  qwe.begin(9600);
}
 
// the loop routine runs over and over again forever:
void loop() {
  while(qwe.available()>0)
 { 
   A[i]=qwe.read();
   // B[i]=qwe.read();
   i++;
   if (i>=3) break;
 }
 //////////////////////////////////////////
 for (m=0;m<3;m++)
 {
   if (B[m]==A[m])break;
 }
 
 
 ////////////////////////////////////
 for (j=0;j<3;j++)
 {
   B[j]=A[j];
 }
  if(i>0){
    for (n=0;n<i;n++)
    Serial.println(A[n],5);
    B[n]=A[n];
//    Serial.println(B[n]);
    //Serial.println("");
    i=0;
  }}
 
использовал все типы и всеравно не получается как надо (((

 

Echo free
Offline
Зарегистрирован: 10.03.2014

Nokia пишет:
Вот передаю данные с одной ардуино 

float A[3];

long B[15];
   B[j]=A[j];

    B[n]=A[n];

использовал все типы и всеравно не получается как надо (((

 

порядок приема-передачи байтов

+                  ++++++++++++++++++++++++

 

тренируйтесь  в первой версии на единичных байтах , а не на float и long

Nokia
Offline
Зарегистрирован: 09.03.2014

Не обращайте внимание на массив В так как он не где не выводится и некуда не записывается. Я пользуюся только массивом А.

 

Nokia
Offline
Зарегистрирован: 09.03.2014
#include <SoftwareSerial.h>

SoftwareSerial  qwe (9,8);

int n,m,i,j;
float A[3];

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  Serial.begin(9600);
  qwe.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  while(qwe.available()>0)
 { 
   A[i]=qwe.read();
   // B[i]=qwe.read();
   i++;
   if (i>=3) break;
 }

 for (j=0;j<3;j++)

  if(i>0){
    for (n=0;n<i;n++)
    Serial.println(A[n],5);

    i=0;
  }}

 

 

Nokia
Offline
Зарегистрирован: 09.03.2014
#include <SoftwareSerial.h>

SoftwareSerial  qwe (9,8);

int n,m,i,j,c;
float A[3];

void setup() {                

  Serial.begin(9600);
  qwe.begin(9600);
  
}


void loop() {
  for (i=0;i<3;i++){
    if (i%3==0)
    {
      
      A[i]=30.21230;

      qwe.write(A[i]);
    }
    else if (i%3==1)
    {
     A[i]=59.76884;
      qwe.write(A[i]);
    } else{
         A[i]=130;
         qwe.write(A[i]);
          }
    }
    delay(1000);
  }

 

 

com
Offline
Зарегистрирован: 06.09.2013

цикл for пропустили

если это, конечно, имеет значение на фоне общего непонимания

Nokia
Offline
Зарегистрирован: 09.03.2014
Echo free
Offline
Зарегистрирован: 10.03.2014

 

Serial.println(my_float_var);

com
Offline
Зарегистрирован: 06.09.2013

Nokia пишет:

void loop() {

  while(qwe.available()>0)
 { 
   A[i]=qwe.read();
   // B[i]=qwe.read();
   i++;
   if (i>=3) break;
 }

ладно, если намеков не понимаете, спрошу в лоб - чему равно значениет переменной "i"?

хотя какие там циклы...

вам же дело посоветовали

Echo free пишет:

тренируйтесь  в первой версии на единичных байтах , а не на float и long

Nokia
Offline
Зарегистрирован: 09.03.2014

Вот подругому сделал  передача данных:


#include <EEPROM.h>
#include <SoftwareSerial.h>

SoftwareSerial  qwe (9,8);

int address = 0;
int i=0;
byte value;
float n,m,g;
float A[3];
void setup()
{
  Serial.begin(9600);
  qwe.begin(9600);
  while (!Serial) {
    ; 
  }
}

void loop()
{ for (i=0;i<2;i++){
  if (i%2==0){

  A[0]=30.54672;
  qwe.write(A[0]); 
    }
    else 
   if (i%2==1)
    {
  A[1]=45.23423;
 qwe.write(A[1]);
    } 
  delay(1500);
}}

 

Вот прием данных:
#include <SoftwareSerial.h>
#include <EEPROM.h>
SoftwareSerial  qwe (9,8);

int i=0;
float A[2];
void setup() {                

  Serial.begin(9600);
  qwe.begin(9600);
}


void loop() {
  while(qwe.available()>0)
 { 
  if (i==0) {
   A[0]=qwe.read();
    Serial.println(A[0], 5);
     i++;
 }else {    
   A[1]=qwe.read();
   Serial.println(A[1], 5);
   i=0;}
  }}

 

 

Nokia
Offline
Зарегистрирован: 09.03.2014

Вот смотрите при передачи данных просто в монитор порт A[0]=30.54672;  Serial.println(A[0], 5)  то значение мне выводит правельно, но при передаче через Rx и Tx он выведет 30.0000. Каким методом можно вывести число правельно?

Nokia
Offline
Зарегистрирован: 09.03.2014

Не томите душу подскажите лудше )))

Nokia
Offline
Зарегистрирован: 09.03.2014

Вообщем косяк тут в самом порту, почемуто большое число не хочет записываться в порт 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Nokia пишет:

Не томите душу подскажите лудше )))

Мягкий знак пропустили...

Навскидку, у Вас где-то происходит преобразование типа float в int, в результате десятичная часть теряется безвозвратно. Если так хочется работать только с целыми - ну, умножайте исходное число на 100 или 1000, чтобы дробная часть перешла в целое...

com
Offline
Зарегистрирован: 06.09.2013

Nokia пишет:

Вот смотрите при передачи данных просто в монитор порт A[0]=30.54672;  Serial.println(A[0], 5)  то значение мне выводит правельно, но при передаче через Rx и Tx он выведет 30.0000.

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

зы.

гляньте на досуге, что возвращает softwareserial.read

Alexander
Offline
Зарегистрирован: 25.04.2010