asdasdadas

//----------------------------------------------------------------------------------------------

#include     <stdio.h>      /*标准输入输出定义*/
#include     <stdlib.h>     /*标准函数库定义*/
#include     <unistd.h>     /*Unix 标准函数定义*/
#include     <sys/types.h>
#include     <sys/stat.h> 
#include     <fcntl.h>      /*文件控制定义*/
#include     <termios.h>    /*PPSIX 终端控制定义*/
#include     <errno.h>      /*错误号定义*/

#define FALSE  -1
#define TRUE   0

int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
                   B38400, B19200, B9600, B4800, B2400, B1200, B300, };

int name_arr[] = {38400,  19200,  9600,  4800,  2400,  1200,  300, 38400,
                            19200,  9600, 4800, 2400, 1200,  300, };

void set_speed(int fd, int speed){

         int   i;
         int   status;
         struct termios   Opt;

         tcgetattr(fd, &Opt);
         for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)
      {
                   if (speed == name_arr[i])
              {   
                            tcflush(fd, TCIOFLUSH);   
                            cfsetispeed(&Opt, speed_arr[i]);
                            cfsetospeed(&Opt, speed_arr[i]); 
                            status = tcsetattr(fd, TCSANOW, &Opt);

                            if (status != 0)
                {      
                                     perror("tcsetattr fd");
                                     return;   
                                 }  

                            tcflush(fd,TCIOFLUSH); 
                         }
           }
}


int set_Parity(int fd,int databits,int stopbits,int parity)
{
         struct termios options;
         if ( tcgetattr( fd,&options)  !=  0)
       {
                   perror("SetupSerial 1");   
                   return(FALSE);
           }

         options.c_cflag &= ~CSIZE;
         options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
         options.c_oflag  &= ~OPOST;   /*Output*/

         switch (databits) /*设置数据位数*/
           {  

         case 7:               
                   options.c_cflag |= CS7;
                   break;
         case 8:   
                   options.c_cflag |= CS8;
                   break; 
         default:  
                   fprintf(stderr,"Unsupported data size/n"); return (FALSE);
           }

      switch (parity)
       { 

         case 'n':
         case 'N':  
                   options.c_cflag &= ~PARENB;   /* Clear parity enable */
                   options.c_iflag &= ~INPCK;     /* Enable parity checking */
                   break;
         case 'o': 
         case 'O':   
                   options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
                   options.c_iflag |= INPCK;             /* Disnable parity checking */
                   break;
         case 'e':
         case 'E': 
                   options.c_cflag |= PARENB;     /* Enable parity */  
                   options.c_cflag &= ~PARODD;   /* 转换为偶效验*/   
                   options.c_iflag |= INPCK;       /* Disnable parity checking */
                   break;
         case 'S':
         case 's':  /*as no parity*/ 
                   options.c_cflag &= ~PARENB;
                   options.c_cflag &= ~CSTOPB;break;
         default: 
                   fprintf(stderr,"Unsupported parity/n");  
                   return (FALSE);
              }

/* 设置停止位*/

         switch (stopbits)
          { 
              case 1:  
                   options.c_cflag &= ~CSTOPB;
                break;
              case 2:  
                 options.c_cflag |= CSTOPB;
                   break;
              default:  
                 fprintf(stderr,"Unsupported stop bits/n");
                 return (FALSE);
            }

/* Set input parity option */

          if (parity != 'n') 
               options.c_iflag |= INPCK;

          tcflush(fd,TCIFLUSH);
          options.c_cc[VTIME] = 0; /* 设置超时15 seconds*/ 
          options.c_cc[VMIN] = 0; /* define the minimum bytes data to be readed*/

             if (tcsetattr(fd,TCSANOW,&options) != 0) 
               {
                perror("SetupSerial 3"); 
                  return (FALSE);
               }

          return (TRUE);

}


int OpenDev(char *Dev)
{
        int     fd = open( Dev, O_RDWR | O_NOCTTY | O_NDELAY  );
        //| O_NOCTTY | O_NDELAY        
        if (-1 == fd)       
         {                       
                  perror("Can't Open Serial Port");
                  return -1;           
         }     
         else 
                  return fd;
}

int main(void)
{
         int fd;
      int kflag;
         char buff_in[5];
         char buff_out[5];
         char *dev  = "/dev/ttyS0"; //串口1
         fd = OpenDev(dev);
         set_speed(fd,9600);

         if (set_Parity(fd,8,1,'N') == FALSE) 
       {
              printf("Set Parity Error/n");
           }

         while (1) //循环读取数据
           { 
        printf("/nserial out:");
        scanf("%s",buff_out);
        kflag = write(fd, buff_out, 4);
           kflag = read(fd, buff_in, 4);
        printf("/nserial in:%c%c%c%c",buff_in[0],buff_in[1],buff_in[2],buff_in[3]);
           }

         close(fd);
}

 

//----------------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值