串口应用程序

#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

/**

*@brief  设置串口通信速率

*@param  fd     类型 int  打开串口的文件句柄

*@param  speed  类型 int  串口速度

*@return  void

*/

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);  

                   } 

         }

}

/**

*@brief   设置串口数据位,停止位和效验位

*@param  fd     类型  int  打开的串口文件句柄

*@param  databits 类型  int 数据位   取值 为 7 或者8

*@param  stopbits 类型  int 停止位   取值为 1 或者2

*@param  parity  类型  int  效验类型 取值为N,E,O,,S

*/

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] = 13; /* 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         

         if (-1 == fd)        

         {                        

                   perror("Can't Open Serial Port");

                   return -1;            

         }      

         else  

                   return fd;

}

void getcardinfo(char *buff){

         int fd;

         int nread,count=0;

         char tempbuff[13];

         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");

                   //return -1;

         }

         while (1) //循环读取数据

         {  

                   count=0;

                   //sleep(5000);

                   while(1)

                   {

                            if((nread = read(fd, tempbuff, 13))>0)

                            {

                            //printf("/nLen %d/n",nread);

                                     memcpy(&buff[count],tempbuff,nread);

                                     count+=nread;

                            }

                            if(count==13)

                            {

                                     buff[count+1] = '/0';  

                            //printf( "/n%s", buff);

                                     break;

                            }

                   }

                   //break;

         }

         //return buff;

         close(fd);

         pthread_exit(NULL);

         //close(fd); 

         // exit (0);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值