Не выводится на serial monitor, отправляя строку на serial.print

Я получаю два 10-битных значения от аналоговых выводов. Эти два значения в строке, ";" объединяются с .

например: 515; 510

Я отправляю его на другой arduino через Serial.print. Я не могу отобразить это строковое выражение на другом последовательном мониторе arduino. Но когда я нажимаю кнопку сброса координатора arduino, появляется несколько значений. Вы можете мне помочь?

Мой Код Координатора:

#include <SoftwareSerial.h>
#define xBeeRxPin 10
#define xBeeTxPin 9
int deger3;
int deger4;
SoftwareSerial xBeeSerial(xBeeRxPin, xBeeTxPin);

void setup() { 
  //Serial.begin(9600);
  xBeeSerial.begin(38400);
  }void loop() {
     
    deger3 = analogRead(A0);
    deger4 = analogRead(A2);
  
    String deger5 = " " + (String)deger3 + ";" + (String)deger4 ;
    
    Serial.println("string ifade: " + deger5);
  
    xBeeSerial.print(deger5);
  }

Мой код получателя:

#include <SoftwareSerial.h>
#define xBeeRxPin 10
#define xBeeTxPin 9
SoftwareSerial xBeeSerial(xBeeRxPin, xBeeTxPin);
String d1;

void setup() {
  xBeeSerial.begin(38400);
  Serial.begin(38400);
}
void loop() {
  if(xBeeSerial.available()){
    d1=xBeeSerial.readString();
    Serial.print(d1);
  }
}

, 👍2


2 ответа


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

1

Я получил нужные мне значения и выполнил разделение. Я отправляю список положений джойстика через последовательное соединение на arduino в следующем формате

515;520

Который будет проанализирован следующим образом:

х=515

y=520

МиКоординатор:

#include <SoftwareSerial.h>
#define xBeeRxPin 10
#define xBeeTxPin 9
int deger3;
int deger4;
SoftwareSerial xBeeSerial(xBeeRxPin, xBeeTxPin);

void setup() { 
  Serial.begin(38400);
  
}void loop() {
  xBeeSerial.begin(38400); 
  deger3 = analogRead(A0);
  deger4 = analogRead(A2);
  
  String deger5 =  (String)deger3 + ";" + (String)deger4 ;
  Serial.println("string ifade: " + deger5);

  xBeeSerial.println(deger5);
  
  delay(200);
}

Мой получатель:

#include <SoftwareSerial.h>
#define xBeeRxPin 10
#define xBeeTxPin 9
SoftwareSerial xBeeSerial(xBeeRxPin, xBeeTxPin);
String d1,d2,d3;

void setup() {
  xBeeSerial.begin(38400);
  Serial.begin(38400);
}
void loop() { 
  if(xBeeSerial.available()>0){
    d1=xBeeSerial.readStringUntil('\n');
    //Serial.print(d1);
    d2 = d1.substring(0,d1.indexOf(59));
    d3 = d1.substring(d1.indexOf(59)+1);
    Serial.println("x ekseni: " + d2);
    Serial.println("y ekseni: " + d3);
  }  
}
,

1

Существует фундаментальная проблема с вашей коммуникационной стратегией, и она заключается в том, что вам нечего сказать получателю "Это конец сообщения".

Вы посылаете постоянный поток

 515; 510 515; 510 515; 510 515; 510 515; 510 515; 510 515; 510 515; 510 515; 510 515; 510 515; 510 515; 510 515; 510 515; 510.....

и получатель действительно не знает, что с этим делать.

Это происходит потому, что вы используете функцию .ReadString() в получателе. Это позволит вслепую получать символы и сохранять их в целевой строке до тех пор, пока эти символы не перестанут поступать. И это происходит только после перерыва в передаче не менее чем на 1 секунду. Этого никогда не произойдет. Так никогда не кончается. То есть до тех пор, пока вы не сбросите отправителя и он не увидит этот перерыв в передаче.

Это очень грубая функция, и я бы никогда никому не рекомендовал использовать ее для чего-либо.

Вместо этого вам нужно разбить вашу передачу на отдельные строки с помощью .println() или добавления \n к строке. Затем вы можете использовать .readStringUntil('\n'), чтобы получить каждую строку по очереди и отобразить ее.

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

,

Могу ли я справиться с этим, используя xBeeSerial.end, например xBeeSerial.begin?, @Enes Orhan

Нет. Вы должны создать правильный синтаксис и поток информации. Совсем как английский. В данный момент вы отправляете содержимое книги в одну строку без знаков препинания и абзацев. Делайте это правильно. Не пытайтесь срезать углы. Вы просто закончите тем, что будете еще больше разочарованы., @Majenko

Я новичок в работе с Arduino. Это действительно тяжело для меня. Кроме того, я не очень хорошо говорю по-английски, извините за это. Можете ли вы внести улучшения непосредственно в код?, @Enes Orhan

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

если(xBeeSerial.available()){ d1=xBeeSerial.readStringUntil('\n'); Серийный номер.println(d1); }, @Enes Orhan

509;509 509;508 510;508 510;508 510;508 510;508 510;508 510;508 510;508 511;508 510;508, @Enes Orhan