Как сохранить или сохранить новую строку Serial Read и Print as String

У меня есть этот код для отправки Hex на внешнее оборудование с использованием последовательной записи (связь UART): {0xbb, 0x00, 0x22, 0x00, 0x00, 0x22, 0x7e}, а затем последовательное оборудование дает ответ Arduino, и я печатаю с помощью Serial. print: BB 02 22 00 11 D0 34 14 00 00 00 00 00 00 00 24 12 14 11 62 77 69 EA 7E Проблема, на самом деле, печатается как новая строка / аппаратное обеспечение отправляет шестнадцатеричный код один за другим, например: BB 02 22 и т. д. Он печатается без окончания строки, потому что я использую Serial.print. Как я могу получить и сохранить все данные/шестнадцатеричный код из ответа оборудования до его завершения (до 7E или 0x7e). А затем распечатать его как строку. Я пробовал какой-то код буфера или последовательное событие, но он не работает должным образом. Благодарить

#include <SoftwareSerial.h>
SoftwareSerial serial(D5,D6);

//#define DEBUG
unsigned char incomingByte;

void sendIdentifyCmd ()
{
  serial.write (0xbb);   
  serial.write ((byte)0x00);
  serial.write (0x22); 
  serial.write ((byte)0x00);                 
  serial.write ((byte)0x00);                 
  serial.write (0x22);
  serial.write (0x7e);             
#ifdef DEBUG
  Serial.print (0xbb);
  Serial.print (0x00);
  Serial.print (0x22);
  Serial.print (0x00);
  Serial.print (0x00);
  Serial.print (0x22);
  Serial.print (0x7e);
  Serial.println ();
#endif
}

void setup ()
{
  Serial.begin (115200);
  serial.begin (115200);
  Serial.println ("begin initial Serial!\n");
}

void loop ()
{
  sendIdentifyCmd ();
  delay (2);
  while(serial.available () > 0)
  {
      incomingByte=serial.read ();
      if (incomingByte <= 0x0F) Serial.print("0");
      Serial.print (incomingByte,HEX);
      Serial.print (' ');
     
  }
  Serial.println ();
  delay (1000);
}

Я пробовал байты последовательного чтения до тех пор, пока не появится код ниже, но он просто печатает abc: 2abc: 5

void loop ()
{
  sendIdentifyCmd ();
  delay (2);
  while(serial.available () > 0)
  {
      incomingByte=serial.read ();
     
      if (incomingByte <= 0x0F) Serial.print("0");
      Serial.print (incomingByte,HEX);
      Serial.print (' ');
  }
  Serial.println();
  delay(1000);
  while(serial.available()>0)
  {
    abc=serial.readBytesUntil(0xFF, buffer, 24);
    Serial.print("abc: ");
    Serial.print(abc, HEX);
  }
  Serial.println ();
  delay (1000);
}

person Nautical Space    schedule 15.01.2021    source источник
comment
возврат readBytesUntil — количество прочитанных байтов   -  person Juraj    schedule 15.01.2021
comment
Используйте Sting incomingString=serial.readString(); вместо incomingByte=serial.read ();   -  person mehdi    schedule 15.01.2021
comment
Я пытался использовать чтение как строку, но он печатал случайный символ на последовательном мониторе.   -  person Nautical Space    schedule 17.01.2021


Ответы (1)


Если вы знаете длину внешнего аппаратного ответа (обычно вы должны знать), вы можете использовать метод .readBytes() для безопасного чтения всего последовательного буфера.

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


#define BUFF_SIZE 24   // define buffer length
byte Buff[BUFF_SIZE];  // define buffer byte array

byte Message2Send[10]; // some message to send

void setup()
{
    Serial.begin(9600);
    
    SetupTimer1(); // define a function to setup timer1 registers and enable interrupts

}


void loop()
{
    if (Serial.available () > 0)
    {
       Serial.readBytes(Buff, BUFF_SIZE);
    }
}

// Timer1 Interrupt callback 
ISR(TIMER1_COMPA_vect) 
{
    Serial.write(Message2Send, 10);
}

// Setting timer1 interrupt at 1Hz
void SetupTimer1() 
{
  cli();      //stop interrupts
  
  // Timer Register setups
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;
  // set compare match register for 1Hz increments
  OCR1A = 15624;  // = (16*10^6) / (1*1024) - 1 

  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS12) | (1 << CS10);  
  TIMSK1 |= (1 << OCIE1A);

  sei();  //allow interrupts
}

для получения дополнительной информации о таймерах см. это

person Mansour Torabi    schedule 16.01.2021
comment
Основываясь на моем результате, напечатайте без пробела: BB 02 22 00 11 D0 34 14 00 00 00 00 00 00 00 24 12 14 11 62 77 69 EA 7E, это 24 байта, это правильно? - person Nautical Space; 17.01.2021
comment
Да, конечно, длина вашего аппаратного ответа составляет 24 байта. - person Mansour Torabi; 17.01.2021