IvoSilva

writenoncanonical.c v2

Oct 10th, 2014
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.22 KB | None | 0 0
  1. /*Non-Canonical Input Processing*/
  2.  
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <termios.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9.  
  10. #define BAUDRATE B38400
  11. #define MODEMDEVICE "/dev/ttyS0"
  12. #define _POSIX_SOURCE 1 /* POSIX compliant source */
  13. #define FALSE 0
  14. #define TRUE 1
  15. #define F 0x7e
  16. #define A 0x03
  17. #define S 0x03
  18. #define U 0x07
  19.  
  20. volatile int STOP=FALSE;
  21.  
  22. int main(int argc, char** argv)
  23. {
  24.     system("clear");
  25.  // CREATING TRAMA
  26.     unsigned char setup[5];
  27.     setup[0]=F;
  28.     setup[1]=A;
  29.     setup[2]=S;
  30.     setup[3]=setup[1]^setup[2];
  31.     setup[4]=F;
  32.  
  33.  
  34.     int fd,c, res;
  35.  
  36.     struct termios oldtio,newtio;
  37.     int i=0, sum = 0, speed = 0;
  38.    
  39.     /*if ( (argc < 2) ||
  40.          ((strcmp("/dev/ttyS0", argv[1])!=0) &&
  41.           (strcmp("/dev/ttyS1", argv[1])!=0) )) {
  42.       printf("Usage:\tnserial SerialPort\n\tex: nserial /dev/ttyS1\n");
  43.       exit(1);
  44.     }/*
  45.  
  46.  
  47.   /*
  48.     Open serial port device for reading and writing and not as controlling tty
  49.     because we don't want to get killed if linenoise sends CTRL-C.
  50.   */
  51.  
  52.  
  53.     fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
  54.     if (fd <0) {perror(argv[1]); exit(-1); }
  55.  
  56.     if ( tcgetattr(fd,&oldtio) == -1) { /* save current port settings */
  57.       perror("tcgetattr");
  58.       exit(-1);
  59.     }
  60.  
  61.     bzero(&newtio, sizeof(newtio));
  62.     newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
  63.     newtio.c_iflag = IGNPAR;
  64.     newtio.c_oflag = 0;
  65.  
  66.     /* set input mode (non-canonical, no echo,...) */
  67.     newtio.c_lflag = 0;
  68.  
  69.     newtio.c_cc[VTIME]    = 3;   /* inter-character timer unused */
  70.     newtio.c_cc[VMIN]     = 1;   /* blocking read until 5 chars received */
  71.    
  72.  
  73.  
  74.  
  75.   /*
  76.     VTIME e VMIN devem ser alterados de forma a proteger com um temporizador a
  77.     leitura do(s) próximo(s) caracter(es)
  78.  
  79.   */
  80.  
  81.  
  82.  
  83.     tcflush(fd, TCIOFLUSH);
  84.  
  85.     if ( tcsetattr(fd,TCSANOW,&newtio) == -1) {
  86.       perror("tcsetattr");
  87.       exit(-1);
  88.     }
  89.  
  90.  
  91.  
  92.  
  93.  
  94.   /*
  95.     O ciclo FOR e as instruções seguintes devem ser alterados de modo a respeitar
  96.     o indicado no guião
  97.   */
  98.  
  99.  
  100.  
  101.  
  102.     printf("New termios structure set(Receiving Message)\n");
  103.  
  104.     unsigned char msg;
  105.     char UA[5];
  106.     int aux=0;
  107.     int counter=0;
  108.     int sendAgain=1;
  109.     int state;
  110.     int done=0;
  111.     int msgsent=0;
  112.     int res2;
  113.  
  114.    
  115.     for(counter ; counter < 3; counter++){
  116.         printf("%s%d\n" ,"Sending data. Try# " , counter+1);
  117.             res = write(fd,setup,5);
  118.         state=0;
  119.         while (state < 5 )
  120.             {      
  121.                   res2 = read(fd,&msg,1);
  122.               if(res2 == -1){
  123.                 sleep(3);
  124.                 break;
  125.                   }
  126.               else msgsent=1;
  127.  
  128.                     switch (state)
  129.                     {
  130.                             case 0:
  131.                         if (msg == F){
  132.                         UA[state]=msg;
  133.                         state++;
  134.                         }  
  135.                                    
  136.                                     break;
  137.                             case 1:
  138.                                     if (msg == A){
  139.                         UA[state]=msg;
  140.                         state++;
  141.                         }
  142.                            
  143.                                             else if(msg != A && msg !=F) state--;
  144.  
  145.                         break;
  146.  
  147.                             case 2:
  148.                                     if (msg == U){
  149.                         UA[state]=msg;
  150.                         state++;
  151.                         }  
  152.                        
  153.                                             else if(msg == F) state--;
  154.                    
  155.                                             else state=0;
  156.  
  157.                         break;
  158.                             case 3:
  159.                                     if (msg == (A^U)){
  160.                         UA[state]=msg;
  161.                         state++;
  162.                         }  
  163.    
  164.                         else state=0;
  165.                                    
  166.                                     break;
  167.                             case 4:
  168.                                     if (msg == F){
  169.                         UA[state]=msg;
  170.                         state++;
  171.                         done=1;
  172.                         }
  173.    
  174.                                             else state=0;
  175.  
  176.                                     break;
  177.                     }
  178.        
  179.             }
  180.         if(done) break;
  181.           }
  182.  
  183.     if(msgsent == 0 ) printf("Could not send any message. UA not received");
  184.     else {
  185.         for(;aux < 5; aux++){
  186.                 printf("%x \n", UA[aux]);
  187.         }
  188.           }
  189.  
  190.  
  191.  
  192.  
  193.    
  194.     if ( tcsetattr(fd,TCSANOW,&oldtio) == -1) {
  195.       perror("tcsetattr");
  196.       exit(-1);
  197.     }
  198.     close(fd);
  199.     return 0;
  200. }
Advertisement
Add Comment
Please, Sign In to add comment