linux-serial.c

来自「用于linux系统中实现ARM开发板与上位机之间的串行通信」· C语言 代码 · 共 84 行

C
84
字号
#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>   
main()
{
     int fd;
     int i;
     int len;
     int n=0;      
     char read_buf[256];
     char write_buf[256];
     struct termios opt; 
    
     fd = open("/dev/tts/0", O_RDWR | O_NOCTTY);    //默认为阻塞读方式
     if(fd == -1)
          perror("open serial 0\n");
 
     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_cflag &=~INPCK;
     opt.c_cflag |= (CLOCAL | CREAD);
 
     opt.c_lflag &=~(ICANON | ECHO | ECHOE | ISIG);
 
     opt.c_oflag &=~OPOST;
 
     opt.c_iflag &=~ICRNL;
     opt.c_iflag &=~INLCR;
    
     opt.c_cc[VTIME] = 150;
     opt.c_cc[VMIN] = 1;
    
     tcflush(fd, TCIOFLUSH);
 
     printf("configure complete\n");
    
     if(tcsetattr(fd, TCSANOW, &opt) != 0)
     {
          perror("serial error");
          return -1;
     }
     printf("start send and receive data\n");
  
     while(1)
     {    
          n = 0;
          len = 0;
          bzero(read_buf,sizeof read_buf);
          bzero(write_buf,sizeof write_buf);
 
          while( (n = read(fd, read_buf, 14)) > 0 )
          {
               for(i=len; i<(len+n); i++)
               {
                    write_buf[i] = read_buf[i-len];
               }
               len += n;
               if(len == 14)    //读完全部14个数据就结束
                    break;
          }
 
          for(i=0; i<len; i++)
               printf("%d ",write_buf[i]);
 
          n = write(fd, write_buf, len);
          printf("write %d chars\n",n);
     }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?