linux下c语言实现串口控制

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

/***@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 fd1");
  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;
 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;
 options.c_cc[VTIME] = 150; // 15 seconds
 options.c_cc[VMIN] = 0;
 
 tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
 if (tcsetattr(fd,TCSANOW,&options) != 0)
 {
  perror("SetupSerial 3");
  return (FALSE);
 }
 return (TRUE);
}
/**
*@breif 打开串口
*/
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;
}
/**
*@breif  main()
*/
int main(int argc, char **argv)
{
 int fd;
 int nread;
 char buff[512];
 char *dev ="/dev/ttyS0";  //com0 为 ttyS0
 fd = OpenDev(dev);
 if (fd>0)
  set_speed(fd,19200);
 else
 {
  printf("Can't Open Serial Port!/n");
  exit(0);
 }
 if (set_Parity(fd,8,1,'N')== FALSE)
 {
  printf("Set Parity Error/n");
  exit(1);
 }
 /*
 while(1)
 {
  while((nread = read(fd,buff,512))>0)
  {
   printf("/nLen %d/n",nread);
   buff[nread+1]='/0';
   printf("/n%s",buff);
  }
 }
 */
 buff = "test the com2/n";
 write(fd,buf,20);
//close(fd);
//exit(0);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值