只能从串行打印单个字节

我正在尝试从 arduino 读取数据(通过设置软串行并将其连接到 beaglebone 上的 cp2102)。这是我的 beaglebone 的代码:

// C library headers
#include <stdio.h>
#include <string.h>

// Linux headers
#include <fcntl.h> // Contains file controls like O_RDWR
#include <errno.h> // Error integer and strerror() function
#include <termios.h> // Contains POSIX terminal control definitions
#include <unistd.h> // write(),read(),close()

int main() {
  // Open the serial port. Change device path as needed (currently set to an standard FTDI USB-UART cable type device)
  int serial_port = open("/dev/ttyUSB0",O_RDWR);

  // Create new termios struc,we call it 'tty' for convention
  struct termios tty;

  // Read in existing settings,and handle any error
  if(tcgetattr(serial_port,&tty) != 0) {
      printf("Error %i from tcgetattr: %s\n",errno,strerror(errno));
      return 1;
  }

  tty.c_cflag &= ~PARENB; // Clear parity bit,disabling parity (most common)
  tty.c_cflag &= ~CSTOPB; // Clear stop field,only one stop bit used in communication (most common)
  tty.c_cflag &= ~CSIZE; // Clear all bits that set the data size 
  tty.c_cflag |= CS8; // 8 bits per byte (most common)
  tty.c_cflag &= ~CRTSCTS; // Disable RTS/CTS hardware flow control (most common)
  tty.c_cflag |= CREAD | CLOCAL; // Turn on READ & ignore ctrl lines (CLOCAL = 1)
tty.c_cflag &= ~(PARENB | PARODD); //Clearing even and odd parity

  tty.c_lflag &= ~ICANON;
  tty.c_lflag &= ~ECHO; // Disable echo
  tty.c_lflag &= ~ECHOE; // Disable erasure
  tty.c_lflag &= ~ECHONL; // Disable new-line echo
  tty.c_lflag &= ~ISIG; // Disable interpretation of INTR,QUIT and SUSP
  tty.c_iflag &= ~(IXON | IXOFF | IXANY); // Turn off s/w flow ctrl
  tty.c_iflag &= ~(IGNBRK|BRkint|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL); // Disable any special handling of received bytes

  tty.c_oflag &= ~OPOST; // Prevent special interpretation of output bytes (e.g. newline chars)
  tty.c_oflag &= ~ONLCR; // Prevent conversion of newline to carriage return/line feed
  // tty.c_oflag &= ~OXTABS; // Prevent conversion of tabs to spaces (NOT PRESENT ON LINUX)
  // tty.c_oflag &= ~ONOEOT; // Prevent removal of C-d chars (0x004) in output (NOT PRESENT ON LINUX)

tty.c_cc[VMIN] = 50;  // Wait for 50 characters or
tty.c_cc[VTIME] = 50; // Wait for 5 seconds

  // Set in/out baud rate to be 9600
  cfsetispeed(&tty,B9600);
  cfsetospeed(&tty,B9600);

  // Save tty settings,also checking for error
  if (tcsetattr(serial_port,TCSANOW,&tty) != 0) {
      printf("Error %i from tcsetattr: %s\n",strerror(errno));
      return 1;
  }

  // Write to serial port
  unsigned char msg[] = { 'H','e','l','o','\r' };
  write(serial_port,"Hello,world!",sizeof(msg));

  // Allocate memory for read buffer,set size according to your needs
  char read_buf [256];

  // Normally you wouldn't do this memset() call,but since we will just receive
  // ASCII data for this example,we'll set everything to 0 so we can
  // call printf() easily.
  memset(&read_buf,'\0',sizeof(read_buf));

  // Read bytes. The behaviour of read() (e.g. does it block?,// how long does it block for?) depends on the configuration
  // settings above,specifically VMIN and VTIME
  int num_bytes;
  num_bytes = read(serial_port,&read_buf,sizeof(read_buf));
 
  // n is the number of bytes read. n may be 0 if no bytes were received,and can also be -1 to signal an error.
  if (num_bytes < 0) {
      printf("Error reading: %s",strerror(errno));
      return 1;
  }

  // Here we assume we received ASCII data,but you might be sending raw bytes (in that case,don't try and
  // print it to the screen like this!)
  printf("Read %i bytes. Received message: %s",num_bytes,read_buf);

  close(serial_port);
  return 0; // success
}

这是arduino代码:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2,3); // RX,TX

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Native USB only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  mySerial.println("Hello,world?");
}

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

如果我发送 abc,我会得到 Read 1 bytes. Received message: a 的输出。为什么会发生这种情况?我不确定我在这里遗漏了什么。我正在从 arduino 串行监视器发送数据。

herongxing 回答:只能从串行打印单个字节

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/26916.html

大家都在问