Skip to content
Snippets Groups Projects
Select Git revision
  • 6cda8e027715114e826ac550bc24cab66e12667e
  • master default protected
  • jake
3 results

ring.termios.c

Blame
  • ring.termios.c 1.67 KiB
    //
    // ring.termios.c
    //
    // termios communication ring test
    //
    // Neil Gershenfeld 4/4/21
    //
    // This work may be reproduced, modified, distributed,
    // performed, and displayed for any purpose, but must
    // acknowledge this project. Copyright is retained and
    // must be preserved. The work is provided as is; no
    // warranty is provided, and users accept all liability.
    //
    #include <stdio.h>
    #include <fcntl.h>
    #include <termios.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/time.h>
    //
    #define nloop 100
    //
    int main(int argc,char *argv[]) {
       if (argc != 3) {
          printf("command line: ring.termios serial_port port_speed\n");
          return -1;
          }
       int speed = atoi(argv[2]);
       int port = open(argv[1],O_RDWR|O_NOCTTY|O_NDELAY);
       fcntl(port,F_SETFL,0);
       struct termios term;
       tcgetattr(port,&term);
       term.c_cflag &= ~(PARENB|CSTOPB|CSIZE|CRTSCTS);
       term.c_cflag |= (CS8|CREAD|CLOCAL);
       term.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHONL|ISIG);
       term.c_iflag &= ~(IXON|IXOFF|IXANY|IGNBRK|BRKINT
          |PARMRK|ISTRIP|INLCR|IGNCR|ICRNL);
       term.c_oflag &= ~(OPOST|ONLCR);
       term.c_cc[VTIME] = 0;
       term.c_cc[VMIN] = 1;
       cfsetispeed(&term,speed);
       cfsetospeed(&term,speed);
       tcsetattr(port,TCSANOW,&term);
       unsigned char chr = 0;
       struct timeval start,end;
       tcflush(port,TCIOFLUSH);
       gettimeofday(&start,NULL);
       for (int i = 0; i < nloop; ++i) {
          while (1) {
             write(port,&chr,1);
             read(port,&chr,1);
             if (chr == 0)
                break;
             }
          }
       gettimeofday(&end,NULL);
       printf("byte ring cycles per second: %6.3g\n",nloop*256/((end.tv_sec+end.tv_usec/1e6)-(start.tv_sec+start.tv_usec/1e6)));
       close(port);
       return 0; 
       }