linux串口源码

转载:linux串口编程源码

原文转自:http://blog.csdn.net/yeqishi/article/details/5532002

/*
*************************************************************************
*** 程序说明:示例程序演示了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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值