/*

*************************************************************************

*** 程序说明:示例程序演示了2440平台下linux串口应用开发,可实现2440串口2与串口3的通讯

*** 硬件设置:将2440板子上的串口2、3TXD、RXD交叉短接

*** 编译运行:在宿主机上编译程序源码,打开超级终端(可与2440进行命令交互),

***                在2440平台上打开串口终端,设置端口为ttySAC1,B15200,8bit DATA

*** 结果验证:Com communicate start

                      please send data to me
                      The data you send back
                      have reveived data
                      succeed!and com was closed

*************************************************************************

*/

#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<errno.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<termio.h>
#include<stdlib.h>

int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop);

int open_port(int fd,int comport);

 

int main(void)
{     int fd;
       int nread,i;
       char vcCom_start[]="Com communicate start/n";
       char vcCom_wait[]="please send data to me/n";
       char vcCom_rece[20];
       char vcCom_OKmsg[]="have reveived data/n";
       char vcCom_over[]="succeed!and com was closed/n";
       if((fd = open_port(fd,3))<0)

       {     perror("open_port error");
              return;
       }
       if((i = set_opt(fd,115200,8,'N',1))<0)
       {     perror("set_opt error");
              return;
       }
       printf("fd = %d/n",fd);
 
       write(fd,vcCom_start,sizeof(vcCom_start));       //start com communication (comA send to comB)
       write(fd,vcCom_wait,sizeof(vcCom_wait));         //messsge:wait for the comB send data back to comA

       do                                                                        //wait for the comB send data back to comA
       { nread = read(fd,vcCom_rece,20);
       }while(nread==0);
       vcCom_rece[nread++] = '/n';

       write(fd,vcCom_OKmsg,sizeof(vcCom_OKmsg)); //message:comA had received comB's data
       write(fd,vcCom_rece,nread);                               //show the received data
       write(fd,vcCom_over,sizeof(vcCom_over));         //com comumunication over
 
       close(fd);
       return;
}

 

 

int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop)
{     struct termios newtio,oldtio;
      if(tcgetattr(fd,&oldtio)!=0)
      {      perror("SetupSerial 1");
              return -1;
      }
      bzero(&newtio,sizeof(newtio));

      newtio.c_cflag |= CLOCAL | CREAD;
      newtio.c_cflag &= ~CSIZE;

      switch(nBits)
      {     case 7 :
                  newtio.c_cflag |= CS7;
                  break;
             case 8 :
                  newtio.c_cflag |= CS8;
                  break;
      }

      switch(nEvent)
      {     case 'N' :
                  newtio.c_cflag &= ~PARENB;
                  break;
             case 'O' :
                  break;
      }

      /*set baud rate*/
      switch(nSpeed)
      {     case 2400 :
                  cfsetispeed(&newtio,B2400);
                  cfsetospeed(&newtio,B2400);
                  break;
            case 115200 :
                  cfsetispeed(&newtio,B115200);
                  cfsetospeed(&newtio,B115200);
                  break;
           default :
                  cfsetispeed(&newtio,B9600);
                  cfsetospeed(&newtio,B9600);
                  break;
      }

      /*set stopbit*/
      if(nStop == 1)
      {      newtio.c_cflag &= ~CSTOPB;
      }
      else if(nStop == 2)
      {      newtio.c_cflag |= CSTOPB;
      }

      newtio.c_cc[VTIME] = 0;
      newtio.c_cc[VMIN] = 0;

      tcflush(fd,TCIFLUSH);

      if((tcsetattr(fd,TCSANOW,&newtio))!=0)
      {     perror("com set error");
             return -1;
      }

      printf("set done!/n");

      return 0;

}
int open_port(int fd,int comport)
{    long vdisable;
      if(comport == 1)
      {     fd = open("/dev/ttySAC0",O_RDWR|O_NOCTTY|O_NDELAY);
             if(fd == -1)
             {     perror("Can't Open Serial Port");
                    return -1;
             }
      }
      else if(comport == 2)
      {     fd = open("/dev/ttySAC1",O_RDWR|O_NOCTTY|O_NDELAY);
             if(fd == -1)
             {     perror("Can't Open Serial Port");
                    return -1;
             }
      }
      else if(comport == 3)
      {     fd = open("/dev/ttySAC2",O_RDWR|O_NOCTTY|O_NDELAY);
             if(fd == -1)
             {     perror("Can't Open Serial Port");
                    return -1;
             }
      }

      if(fcntl(fd,F_SETFL,0)<0)
      {     printf("fcntl failed!/n");
      }
      else
      {     printf("fcntl = %d/n",fcntl(fd,F_SETFL,0));
      }
       if(isatty(STDIN_FILENO)==0)
       {    printf("standard input is not a terminal device/n");
       }
       else
       {    printf("isatty success!/n");
       }
       printf("fd-open = %d/n",fd);
       return fd;
}

 

 

 

Logo

更多推荐