Welcome 微信登录

首页 / 操作系统 / Linux / Linux 串口驱动测试代码

#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>      /*错误号定义*/
#include <string.h>#define FALSE  -1
#define TRUE   0int speed_arr[] = { B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300, };unsigned char SetBaud_115200[14];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]);
   //printf("set baud:%d ", name_arr[i]);
     //用于设置终端的相关参数
   status = tcsetattr(fd, TCSANOW, &Opt);  //TCSANOW:不等数据传输完毕就立即改变属性
   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 "); 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 ");   
   return (FALSE); 
  } 
 /* 设置停止位*/ 
 switch (stopbits)
 {  
  case 1:   
   options.c_cflag &= ~CSTOPB; 
   break; 
  case 2:   
   options.c_cflag |= CSTOPB; 
     break;
  default:   
    fprintf(stderr,"Unsupported stop bits "); 
    return (FALSE);
 }
 /* Set input parity option */
 if (parity != "n")  
  options.c_iflag |= INPCK;
 tcflush(fd,TCIOFLUSH);
 
 options.c_cc[VTIME] = 50; /* 设置超时5 seconds*/  
 options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
 options.c_cc[VINTR]    = 0;       /**//* Ctrl-c */
 options.c_cc[VQUIT]     = 0;   /**//* Ctrl- */
 options.c_cc[VERASE]    = 0;   /**//* del */
 options.c_cc[VKILL]    = 0;   /**//* @ */
 options.c_cc[VEOF]     = 0;   /**//* Ctrl-d */
 options.c_cc[VSWTC]    = 0;   /**//* "" */
 options.c_cc[VSTART]   = 0;   /**//* Ctrl-q */
 options.c_cc[VSTOP]    = 0;   /**//* Ctrl-s */
 options.c_cc[VSUSP]    = 0;   /**//* Ctrl-z */
 options.c_cc[VEOL]     = 0;   /**//* "" */
 options.c_cc[VREPRINT] = 0;   /**//* Ctrl-r */
 options.c_cc[VDISCARD] = 0;   /**//* Ctrl-u */
 options.c_cc[VWERASE]  = 0;   /**//* Ctrl-w */
 options.c_cc[VLNEXT]   = 0;   /**//* Ctrl-v */
 options.c_cc[VEOL2]    = 0;   /**//* "" */
 
 options.c_cflag |= (CLOCAL | CREAD);  //忽略DCD信号
 options.c_cflag &= ~CRTSCTS;          //关硬件流控制
 options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //关回显
 options.c_oflag &= ~OPOST;                         //行式输出
 options.c_iflag &= ~(IXON | IXOFF | IXANY);         //关软件流控制
  
 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_NOCTTY | O_NDELAY
 if (-1 == fd)
 {   
  perror("Can"t Open Serial Port");
  return -1; 
 }
 else
  return fd;
}int main(int argc, char **argv)
{
 int uart_fd;
 int nread, nwrite;
 int num = 0;
 char rev_char[128];
 char rev_buf[128];
 char *buff="hello! this is a serial test program,if you can see this,you success! ";
 char *dev  = "/dev/ttyAMA2"; //串口二
 
 uart_fd = OpenDev(dev); //打开设备
 set_speed(uart_fd, 9600); //设置波特率
 
 if (set_Parity(uart_fd,8,1,"n") == FALSE)  //数据位,停止位,校验位
 {
  printf("Set Parity Error ");
  exit (0);
 } while(nread = read(uart_fd, rev_char, 1))  //读返回值
 {
  rev_buf[num++] = rev_char[0];
  if (rev_char[0] == " ")
  {
   rev_buf[num] = "";
   num = 0;
   printf("%s", rev_buf);
  }
  printf("%s", rev_buf);
  if((nwrite = write(uart_fd,buff,strlen(buff)))>0)
  {
   printf("%s ",buff);
  }
 } if (nread == 0)
  printf("No  DATE! ");
 }
 close(uart_fd);
}