Chinaunix首页 | 论坛 | 博客
  • 博客访问: 817999
  • 博文数量: 124
  • 博客积分: 1927
  • 博客等级: 上尉
  • 技术积分: 932
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-31 14:06
文章分类

全部博文(124)

文章存档

2018年(5)

2017年(2)

2016年(6)

2015年(4)

2014年(24)

2013年(7)

2012年(11)

2011年(13)

2010年(52)

我的朋友

分类: LINUX

2011-01-07 17:10:17

好了CYGWIN和MAGIC C++ 3.0,运行 HELLO WORLD!也OK了,就想搞搞串口,以前LINUX服务器没有办法读写,因为没有设备,所以只是知道打开关闭OK,现在可以试一试了。

参考:Linux 下串口编程入门 编程指南

#include           /*标准输入输出定义*/

#include          /*标准函数库定义*/

#include          /*Unix标准函数定义*/

#include       /**/

#include        /**/

#include           /*文件控制定义*/

#include         /*PPSIX终端控制定义*/

#include           /*错误号定义*/

#include  

  设置串口通信速率

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

  speed  类型 int  串口速度

  void*/

#define FALSE  0

#define TRUE  1

int speed_arr[] = &leftsign; B38400, B19200, B9600, B4800, B2400, B1200, B300,

     B38400, B19200, B9600, B4800, B2400, B1200, B300, &rightsign;;

int name_arr[] = &leftsign;38400,  19200,  9600,  4800,  2400,  1200,  300,

     38400,  19200,  9600, 4800, 2400, 1200,  300, &rightsign;;

void set_speed(int fd, int speed)

&leftsign;

  int   i;

  int   status;

  struct termios   Opt;

  tcgetattr(fd, &Opt);

  for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)

   &leftsign;

    if  (speed == name_arr[i])

    &leftsign;

        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;

      &rightsign;

   tcflush(fd,TCIOFLUSH);

   &rightsign;

&rightsign;

/**

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

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

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

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

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

*/

int set_Parity(int fd,int databits,int stopbits,int parity)

&leftsign;

 struct termios options;

 if  ( tcgetattr( fd,&options)  !=  0)

  &leftsign;

   perror("SetupSerial 1");

   return(FALSE);

  &rightsign;

  options.c_cflag &= ~CSIZE;

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

  &leftsign;

   case 7:

    options.c_cflag &line;= CS7;

    break;

   case 8:

  options.c_cflag &line;= CS8;

  break;

 default:

  fprintf(stderr,"Unsupported data size\\n");

  return (FALSE);

 &rightsign;

  switch (parity)

   &leftsign;

   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 &line;= (PARODD &line; PARENB);  /* 设置为奇效验*/

  options.c_iflag &line;= INPCK;             /* Disnable parity checking */

  break;

 case \’e\’:

 case \’E\’:

  options.c_cflag &line;= PARENB;     /* Enable parity */

  options.c_cflag &= ~PARODD;   /* 转换为偶效验*/ 

  options.c_iflag &line;= 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);

  &rightsign;

  /* 设置停止位*/  

  switch (stopbits)

   &leftsign;

   case 1:

    options.c_cflag &= ~CSTOPB;

  break;

 case 2:

  options.c_cflag &line;= CSTOPB;

  break;

 default:

  fprintf(stderr,"Unsupported stop bits\\n");

  return (FALSE);

 &rightsign;

  /* Set input parity option */

  if (parity != \’n\’)

    options.c_iflag &line;= 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)

   &leftsign;

    perror("SetupSerial 3");

  return (FALSE);

 &rightsign;

  return (TRUE);

 &rightsign;

/**

打开串口

*/

int OpenDev(char *Dev)

&leftsign;

int fd = open( Dev, O_RDWR );         //&line; O_NOCTTY &line; O_NDELAY

 if (-1 == fd)

  &leftsign; /*设置数据位数*/

   perror("Can\’t Open Serial Port");

   return -1;

  &rightsign;

 else

 return fd;

&rightsign;

/* write the users command out the serial port */

int send_cmd(int ftty,char * str)

&leftsign;

  int result;

  result = write(ftty,str,strlen(str));/*argv[4], strlen(argv[4]));*/

  if (result < 0)

  &leftsign;

   

    printf("Write command:%s to VC312 failed\\n",str);

    close(ftty);

    exit(1);

  &rightsign;

&rightsign;

/**

 main()

*/

int main(int argc, char **argv)

&leftsign;

 int fd;

 int nread;

 char buff[512];

 char *dev ="/dev/ttyS1";

 fd = OpenDev(dev);

 if (fd>0)

     set_speed(fd,19200);

 else

  &leftsign;

  printf("Can\’t Open Serial Port!\\n");

  exit(0);

  &rightsign;

  if (set_Parity(fd,8,1,\’N\’)== FALSE)

  &leftsign;

    printf("Set Parity Error\\n");

    exit(1);

  &rightsign;

  send_cmd(fd,"at\\r\\n");

  //while(1)

  int len=0;

 &leftsign;

     while((nread = read(fd,buff+len,100))>0)

     &leftsign;

      len+=nread;

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

        buff[len+1]=\’\\0\’;

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

      &rightsign;

   &rightsign;

 printf("\\nLen %d\\n",len);

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

    close(fd);

    exit(0);

&rightsign;

设置硬件流控制

一些版本的UNIX支持使用CTS(Clear to Send)和RTS(Requeut to send)信号线的硬件流量控制.如果你系统中定义了

CNEW_RTSCTS或者CRTSCTS常数,那么就可能支持硬件流量控制.以下可以激活硬件流量控制:

options.c_cflag &line;= CNEW_RTSCTS; /* also called CRTSCTS */

类似地可以这样关闭硬件流量控制:

options.c_cflag &= ~CNEW_RTSCTS;

设置软件流控制

软件流控制可以用IXON,IXOFF和IXANY常数来激活:

options.c_iflag &line;= (IXON &line; IXOFF &line; OXANY );

取消它仅需将那些位掩住:

options.c_iflag &= ~(IXON &line; IXOFF &line; OXANY );

termios.h 定义 :#define CRTSXOFF 0×04000  #define CRTSCTS  0×08000

阅读(3176) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-08 17:42:47

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com