Linux串口操作的一段代码

 Linux串口操作的一段代码

/*
 * termio.c
 *
 *  Created on: 2011-11-2
 *      Author: jieen
 */



#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>      /*错误号定义*/

#if 0
int main(void)
{
    int fd;
    /*以读写方式打开串口*/
    fd = open( "/dev/ttyS0", O_RDWR);
    if (-1 == fd)
    {
        /* 不能打开串口一*/
        perror(" 提示错误!");
    }
    struct  termios Opt;
    tcgetattr(fd, &Opt);
    printf("speed:%x\n",Opt.c_ispeed);
    cfsetispeed(&Opt,B115200);     /*设置为115200Bps*/
    cfsetospeed(&Opt,B115200);
    tcsetattr(fd,TCANOW,&Opt);

}
#endif
/**********************************************************************
代码说明:使用串口二测试的,发送的数据是字符,
但是没有发送字符串结束符号,所以接收到后,后面加上了结束符号。
我测试使用的是单片机发送数据到第二个串口,测试通过。
**********************************************************************/
#define FALSE  -1
#define TRUE   0
/*********************************************************************/
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;
}
int main(int argc, char **argv)
{
        int fd;
        int nread;
        char *dev;
        char buff[512];
        dev = (char *)malloc(15);
        if(argc < 2)
        {
            strcpy(dev,"/dev/ttyS0"); //串口一
        }else
          {
            strncpy(dev,argv[1],strlen(argv[1]));
          }
        fd = OpenDev(dev);
        if(fd == -1)
          exit(EXIT_FAILURE);
        set_speed(fd,115200);
        if (set_Parity(fd,8,1,'N') == FALSE)  {
                printf("Set Parity Error\n");
                exit (0);
        }
        while (1) //循环读取数据
        {
          while((nread = read(fd, buff, 512))>0)
          {
                  printf("\nLen %d\n",nread);
                  buff[nread+1] = '\0';
                  printf( "\n%s", buff);
          }
        }
        //close(fd);
        // exit (0);
}
/**
*@brief  设置串口通信速率
*@param  fd     类型 int  打开串口的文件句柄
*@param  speed  类型 int  串口速度
*@return  void
*/
void set_speed(int fd, int speed){
  int   i;
  int   status;
  struct termios   Opt;
  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, };
  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;
        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] = 150; /* 设置超时15 seconds*/
  options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
  if (tcsetattr(fd,TCSANOW,&options) != 0)
  {
          perror("SetupSerial 3");
          return (FALSE);
  }
  return (TRUE);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值