linux+openwrt+linkit7688:串口的应用程序配置

来源:互联网 发布:英雄联盟原声软件 编辑:程序博客网 时间:2024/06/06 08:34

linux上的串口的应用编程查了一些资料对比之后基本上都是差不多,我自己也做一下笔记:

贴出两个参考网页:
这里主要是程序代码:http://blog.csdn.net/yao_guet/article/details/24768967
这里介绍串口编程函数和结构:http://wenku.baidu.com/link?url=7fcl2uUEqJr2JsL0ognguVMrYJrNjyDI25dve2-NtNywTbmtFsCBHIxwVoB6b_4vy7xK3-vHRtIHLWdyehSdfWZ7oHQeyuTSv9H-RIdqkU_

耐心花一小会时间把上面两编对照着看下来,对linux的串口编程就会有一些感觉了。程序代码也可以看我贴出来的,我也是参考别人的。

串口编程过程:
1、打开串口:fd = open(“/dev/ttyS0”, O_RDWR | O_NOCTTY | O_NDELAY);
2、配置串口:UARTx_Set(fd,57600,0,8,1,’N’);
3、读写串口:read(fd, rcv_buf, 256); / write(fd,send_buf,data_len);
4、关闭串口:close(fd);

上面截出了部分代码,看起来很简单,其实应用层的编程好像也不难。但是我的串口目前还是有点问题,不是代码问题,感觉是menuconfig的配置问题。

代码如下,好坏自己感觉咯:

//串口相关的头文件  #include<termios.h>    /*PPSIX 终端控制定义*/ #include<stdio.h>      /*标准输入输出定义*/  #include<stdlib.h>     /*标准函数库定义*/  #include<unistd.h>     /*Unix 标准函数定义*/  #include<sys/types.h>   #include<sys/stat.h>     #include<fcntl.h>      /*文件控制定义*/  #include<errno.h>      /*错误号定义*/  #include<string.h> //宏定义  #define TRUE   0  #define FALSE  -1  /******************************************************************** 功能:            设置串口数据位,停止位和效验位* 入口参数:        fd         串口文件描述符*                   speed      串口速度*                   flow_ctrl  数据流控制*                   databits   数据位   取值为 7 或者8*                   stopbits   停止位   取值为 1 或者2*                   parity     效验类型 取值为N,E,O,,S*出口参数:         正确返回为1,错误返回为0*******************************************************************/int UARTx_Set(int fd, int speed, int flow_ctrl, int databits, int stopbits, int parity){    int   i;        int   speed_arr[] = {B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300 };        int   name_arr[]  = { 115200,  57600,  38400,  19200,  9600,  4800,  2400,  1200,  300 };    struct termios options;        /* tcgetattr(fd,&options)得到与fd指向对象的相关参数,并将它们保存于options,         * 该函数,还可以测试配置是否正确,该串口是否可用等。         * 若调用成功,函数返回值为0,若调用失败,函数返回值为1.         */    if( tcgetattr( fd,&options)  !=  0)    {        perror("SetupSerial 1");            return(FALSE);     }    //设置串口输入波特率和输出波特率    for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)    {        if  (speed == name_arr[i])        {                   cfsetispeed(&options, speed_arr[i]);             cfsetospeed(&options, speed_arr[i]);              printf("uart_speed=%d ", speed );           }    }         //修改控制模式,保证程序不会占用串口    options.c_cflag |= CLOCAL;    //修改控制模式,使得能够从串口中读取输入数据    options.c_cflag |= CREAD;    //设置数据流控制    switch(flow_ctrl)    {        case 0 ://不使用流控制            options.c_cflag &= ~CRTSCTS;                break;           case 1 ://使用硬件流控制                options.c_cflag |= CRTSCTS;                break;        case 2 ://使用软件流控制                options.c_cflag |= IXON | IXOFF | IXANY;                break;    }    printf("flow_ctrl=%d ",flow_ctrl);    //设置数据位    options.c_cflag &= ~CSIZE; //屏蔽其他标志位    switch (databits)    {          case 5    :            options.c_cflag |= CS5;            break;        case 6    :            options.c_cflag |= CS6;            break;        case 7    :                options.c_cflag |= CS7;            break;        case 8:                options.c_cflag |= CS8;            break;          default:               fprintf(stderr,"Unsupported data size\n");            return (FALSE);     }    printf("databits=%d ",databits);    //设置校验位    switch (parity)    {          case 'n':        case 'N': //无奇偶校验位。            options.c_cflag &= ~PARENB;             options.c_iflag &= ~INPCK;              printf("parity=N ");              break;         case 'o':          case 'O'://设置为奇校验            options.c_cflag |= (PARODD | PARENB);             options.c_iflag |= INPCK;                         break;         case 'e':         case 'E'://设置为偶校验            options.c_cflag |= PARENB;             options.c_cflag &= ~PARODD;                   options.c_iflag |= INPCK;                   break;        case 's':        case 'S': //设置为空格            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);    }    printf("stopbits=%d \n",stopbits);    //修改输出模式,原始数据输出 /*Output*/    options.c_oflag &= ~OPOST;    //options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);//我加的 /*Input*/     options.c_lflag &= ~(ISIG | ICANON);      //设置等待时间和最小接收字符    options.c_cc[VTIME] = 0; /* 读取一个字符等待1*(1/10)s */      options.c_cc[VMIN] = 1;  /* 读取字符的最少个数为1 */    //如果发生数据溢出,接收数据,但是不再读取    tcflush(fd,TCIFLUSH);    //激活配置 (将修改后的termios数据设置到串口中)    if (tcsetattr(fd,TCSANOW,&options) != 0)      {        perror("com set error!\n");          return (FALSE);     }    return (TRUE); }/******************************************************************** 名称:           UART0_Recv* 功能:           接收串口数据* 入口参数:       fd          :文件描述符    *                  rcv_buf     :接收串口中数据存入rcv_buf缓冲区中*                  data_len    :一帧数据的长度* 出口参数:       正确返回为1,错误返回为0*******************************************************************/int UARTx_Recv(int fd, char *rcv_buf,int data_len){    int len,fs_sel;    fd_set fs_read;    struct timeval time;    FD_ZERO(&fs_read);    FD_SET(fd,&fs_read);    time.tv_sec = 10;    time.tv_usec = 0;    //使用select实现串口的多路通信    fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);    if(fs_sel)    {            len = read(fd,rcv_buf,data_len);        printf("I am right!(version1.2) len = %d fs_sel = %d\n",len,fs_sel);              return len;    }    else    {        printf("Sorry,I am wrong!\n");              return FALSE;    }     }/******************************************************************** 名称:            UART0_Send* 功能:            发送数据* 入口参数:         fd         :文件描述符    *                   send_buf    :存放串口发送数据*                   data_len    :一帧数据的个数* 出口参数:        正确返回为1,错误返回为0*******************************************************************/int UARTx_Send(int fd, char *send_buf,int data_len){    int len = 0;    len = write(fd,send_buf,data_len);    if (len == data_len ){        return len;    }         else{        tcflush(fd,TCOFLUSH);        return FALSE;    }}/****************************************************************** 功能:         打开串口并返回串口设备文件描述* 入口参数:     fd:文件描述符   port:串口号(ttyS0,ttyS1,ttyS2)* 出口参数:     正确返回为1,错误返回为0*****************************************************************/int UARTx_Open(int fd){    fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);    if(fd == FALSE)    {        perror("open_port: Unable to open /dev/ttyS0 -");        return(FALSE);    }    //判断串口的状态是否为阻塞状态    if( fcntl(fd,F_SETFL,0)<0 ){        printf("fcntl failed! \n");        return(FALSE);    }         else{        printf("fcntl=%d \n",fcntl(fd, F_SETFL,0));    }    //测试是否为终端设备        if(0 == isatty(STDIN_FILENO) ){        printf("standard input is not a terminal device \n");        return(FALSE);    }    else{        printf("isatty success!\n");    }    printf("fd->open=%d \n",fd);    return (fd);}/******************************************************* 名称:    main*******************************************************************///int main(int argc, char **argv)  int main(void)  {      int fd;                            //文件描述符      int err;                           //返回调用函数的状态      int len;                              int i;      char rcv_buf[256];             char send_buf[20]="uartx_test\n";      //fd = UART0_Open(fd,argv[1]); //打开串口,返回文件描述符      fd = UARTx_Open(fd); //打开串口,返回文件描述符      if(FALSE == fd){                exit(1);        }    //配置串口参数    err = UARTx_Set(fd,57600,0,8,1,'N');      if (FALSE == err){          printf("Set Port Error\n");         exit(1);     }    for( i = 0; i < 10; i++ )      {          len = UARTx_Send(fd, send_buf, strlen(send_buf));          if(len > 0)              printf(" %d send data successful len=%d \n",i,len);          else              printf("send data failed!\n");     }    len = 0 ;    while(1)     {        len = read(fd, rcv_buf, 256);          if(len > 0){            rcv_buf[len] = '\n';            UARTx_Send(fd,rcv_buf,len+1);            printf("len=%d uart_RX_ok \n", len);             len = 0 ;            memset(rcv_buf, 0, sizeof(rcv_buf) );        }         //sleep(2);     }         printf("Close...\n");    close(fd);       return 0;}

你以为这样串口就可以用了么,别人可不可以不知道,我还是不可以。还要写Makefile,配置到menuconfig.这个要等弄好了,在贴上来。

0 0
原创粉丝点击