#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <string.h>
int main()
{
int fd;
int i;
int len;
int n = 0;
char read_buf[20];
char write_buf[20];
char testbuff[]="Hello1263\r\n";
struct termios opt;
fd = open("/dev/ttyUSB2", O_RDWR | O_NOCTTY); //默认为阻塞读方式
write(fd,testbuff,10);
tcgetattr(fd, &opt);
cfsetispeed(&opt, B9600);
cfsetospeed(&opt, B9600);
if(tcsetattr(fd, TCSANOW, &opt) != 0 )
{
perror("tcsetattr error");
return -1;
}
opt.c_cflag &= ~CSIZE;
opt.c_cflag |= CS8;
opt.c_cflag &= ~CSTOPB;
opt.c_cflag &= ~PARENB;
opt.c_iflag &= ~INPCK;//opt.c_cflag &= ~INPCK;the last this is fetal set
opt.c_cflag |= (CLOCAL | CREAD);
opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
opt.c_oflag &= ~OPOST;
opt.c_oflag &= ~(ONLCR | OCRNL); //添加的
opt.c_iflag &= ~(ICRNL | INLCR);
opt.c_iflag &= ~(IXON | IXOFF | IXANY); //添加的
opt.c_cc[VTIME] = 0;
opt.c_cc[VMIN] = 0;
tcflush(fd, TCIOFLUSH);
printf("configure complete\n");
if(tcsetattr(fd, TCSANOW, &opt) != 0)
{
perror("serial error");
return -1;
}
while(1)
{
n = 0;
len = 0;
bzero(read_buf, sizeof(read_buf)); //类似于memset
bzero(write_buf, sizeof(write_buf));
while( (n = read(fd, read_buf, sizeof(read_buf))) > 1 )//>0
{
printf("n= %d \n", n);//
for(i = len; i < (len + n); i++)
{
write_buf[i] = read_buf[i - len];
}
len += n;
}
write_buf[len] = '\0';
write_buf[1]=write_buf[0];
n = write(fd, write_buf, len);
printf("have sended\n");
sleep(2);
}
}
把接收到的字符串第二个字符改成第一个字符,用于验证。串口配置项很重要,需要理解其意。
https://blog.csdn.net/baweiyaoji/article/details/72885633
结构体和函数详细讲解https://wenku.baidu.com/view/33dc137a6bd97f192379e932.html