首页 > 解决方案 > 如何将新行串行读取和打印存储或保存为字符串

问题描述

我有这段代码使用串行写入(UART通信)将十六进制发送到外部硬件:{0xbb, 0x00, 0x22, 0x00, 0x00, 0x22, 0x7e},然后串行硬件回复arduino,我使用串行打印。打印: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);
}

标签: arraysserializationarduinohexstoring-data

解决方案


如果您知道外部硬件响应的长度(通常您应该知道),您可以使用.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
}

有关计时器的更多信息,请参阅


推荐阅读