我正在尝试从 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 串行监视器发送数据。