Передача данных
- Войдите на сайт для отправки комментариев
Пнд, 10/03/2014 - 11:36
Здравствуйте в данный момент пытаюсь реализовать передачу данных с ардуино на ардуино по портам 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;
}}
Здравствуйте в данный момент пытаюсь реализовать передачу данных с ардуино на ардуино по портам 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) учитывайте порядок байтов
Вот передаю данные с одной ардуино
float A[3];
B[n]=A[n];
использовал все типы и всеравно не получается как надо (((
порядок приема-передачи байтов
+ ++++++++++++++++++++++++
тренируйтесь в первой версии на единичных байтах , а не на float и long
Не обращайте внимание на массив В так как он не где не выводится и некуда не записывается. Я пользуюся только массивом А.
#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; }}#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); }цикл for пропустили
если это, конечно, имеет значение на фоне общего непонимания
http://upload.akusherstvo.ru/image614439.png
Serial.println(my_float_var);
void loop() {
ладно, если намеков не понимаете, спрошу в лоб - чему равно значениет переменной "i"?
хотя какие там циклы...
вам же дело посоветовали
тренируйтесь в первой версии на единичных байтах , а не на float и long
Вот подругому сделал передача данных:
#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;} }}Вот смотрите при передачи данных просто в монитор порт A[0]=30.54672; Serial.println(A[0], 5) то значение мне выводит правельно, но при передаче через Rx и Tx он выведет 30.0000. Каким методом можно вывести число правельно?
Не томите душу подскажите лудше )))
Вообщем косяк тут в самом порту, почемуто большое число не хочет записываться в порт
Не томите душу подскажите лудше )))
Мягкий знак пропустили...
Навскидку, у Вас где-то происходит преобразование типа float в int, в результате десятичная часть теряется безвозвратно. Если так хочется работать только с целыми - ну, умножайте исходное число на 100 или 1000, чтобы дробная часть перешла в целое...
Вот смотрите при передачи данных просто в монитор порт A[0]=30.54672; Serial.println(A[0], 5) то значение мне выводит правельно, но при передаче через Rx и Tx он выведет 30.0000.
дык знамо дело у них правильно, ведь монитор порта писали люди, которые умеют читать данные, а вы не только не умеете, но и не хотите учиться.
зы.
гляньте на досуге, что возвращает softwareserial.read
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...