0 串口 2一直有数据但就是读不到,求解 - ARM技术论坛-ARM嵌入式论坛-人气最火爆ARM学习论坛 - 21ic电子技术开发论坛
打印
[S3C2440]

串口 2一直有数据但就是读不到,求解

[复制链接]
1298|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ljljd103|  楼主 | 2014-4-16 22:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ljljd103 于 2014-4-16 22:47 编辑

#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>
#include <sys/time.h>

#define FALSE  -1
#define TRUE   0

int 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)
                {     
                        tcflush(fd, TCIOFLUSH);     
                        cfsetispeed(&Opt, speed_arr);  
                        cfsetospeed(&Opt, speed_arr);
                        //printf("set baud:%d\n", name_arr);                        
                        status = tcsetattr(fd, TCSANOW, &Opt);  
                        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\n"); 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\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);
        }
        /* 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_NDELAY);  //| O_NOCTTY         
        if (-1 == fd)        
        {                        
                perror("Can't Open Serial Port");
                return -1;               
        }        
        else        
                return fd;
}

int main(int argc, char **argv)
{
        int gps_fd, uart_fd, i;
        int nread, nwrite;
        int num = 0;
        char rev_char[1];
        char rev_buf[128];
        //char rev_buf[]="helloWorld!";
        char *dev  = "/dev/s3c2410_serial2"; //串口二
        
        if (gps_fd = open("/dev/TX2440-gps", 0) < 0)               
        {                        
                perror("open device gps");
                exit (0);               
        }
               
        uart_fd = OpenDev(dev);        //打开设备        
        if(fcntl(uart_fd, F_SETFL, 0)<0)
        {
        printf("fcntl failed!\n");
        }
        if(isatty(STDIN_FILENO)>0)
        {
        printf("standard input is not a terminal device\n");
        }
        
        set_speed(uart_fd, 57600); //设置波特率        
        
        if (set_Parity(uart_fd,8,1,'n') == FALSE)  //数据位,停止位,校验位
        {
                printf("Set Parity Error\n");
                exit (0);
        }
        while(1)
        {
                printf("wait...\n");
               
                nread = read(uart_fd, rev_buf, 10); //读返回值        
                if(nread >0)
                {        rev_buf[nread] = '\0';
                        printf("%s\n\r",rev_buf);
                }        
                else printf("Read data failure!\n");

                //Send data
                nwrite = write(uart_fd,rev_buf,strlen(rev_buf));
                printf("send data OK!count=%d\n\r",nwrite);            
                printf("\r\n");
        
        }
        close(uart_fd);
        close(gps_fd);
        return 0;
        
}

相关帖子

沙发
yqhc1216| | 2014-4-17 16:57 | 只看该作者
RS232的?

使用特权

评论回复
板凳
ljljd103|  楼主 | 2014-4-17 22:00 | 只看该作者
s3c2440   UART 串口2的通信

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝