| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1002 人关注过本帖
标题:串口读写程序 PC自环测试
取消只看楼主 加入收藏
lipingping99
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-7-30
结帖率:0
收藏
 问题点数:0 回复次数:0 
串口读写程序 PC自环测试
    我是新来的,多多关照。
    下面这个串口读写程序,还请大家帮我讲解一下。如果改成能下载到ARM上的程序,应该怎么改啊?



#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       0


struct termio
{   
    unsigned short  c_iflag;    //     输入模式标志
    unsigned short  c_oflag;    //    输出模式标志     
    unsigned short  c_cflag;    //    控制模式标志
    unsigned short  c_lflag;    //    local mode flags
    unsigned char  c_line;        //    line discipline   
    unsigned char  c_cc;   //    control characters
};


int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
                    B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400,  19200,  9600,  4800,  2400,  1200,  300, 38400,  
                    19200,  9600,  4800,  2400,  1200,  300, };

int 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]);   
            status = tcsetattr(fd, TCSANOW, &Opt);  
            if  (status != 0) {        
                perror("tcsetattr fd");  
                return;     
            }   
            tcflush(fd,TCIOFLUSH);   
            
            return TRUE;
        }  
    }

    fprintf(stderr,"Unsupported speed\n");
   
    return FALSE;

}

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);
    }

    // important
    options.c_cflag |= CLOCAL | CREAD;
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    options.c_oflag &= ~OPOST;
    options.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
   
    /* Set input parity option */
    if (parity != 'n')   
        options.c_iflag |= INPCK;
    tcflush(fd,TCIFLUSH);
    options.c_cc[VTIME] = 10; /* 设置超时*/   
    options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
   
   
    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   
    if (-1 == fd)   
    {            
        perror("Can't Open Serial Port");
        return -1;        
    }   
    else   
        return fd;
}

int main(int argc, char **argv)
{
    int i, fd;
    int nread, nwrite, cnt, index, cmd;
    unsigned char rcv_buff[512];
    unsigned char send_buff[512];
    char dis_buff[512];
   
    char *dev  = "/dev/ttyS0"; //串口一
   
    if((fd=OpenDev(dev)) == FALSE)
    {
        return -1;
    }
    else
    {
        if(set_speed(fd,38400) == FALSE)
        {
            printf("Set Speed Error\n");
            exit (0);
        }
   
        if (set_Parity(fd,8,1,'N') == FALSE)  
        {
            printf("Set Parity Error\n");
            exit (0);
        }
    }   
   


    while(1)
        {
        printf("sellect: w|r|q\n");
        cmd = getchar();
        switch(cmd)
        {
            case 'w':
                printf("test write\n");
                //发送缓冲区字节数定义
        for(i=0; i<256; i++)
            send_buff[i] = i;               
        cnt= write(fd,send_buff,256);
                if(cnt == -1)
                    printf("Wirte sbuf error.\n");
                else
                    printf("Wirte:%s \tcnt:%d\n", send_buff, cnt);
                break;
            case 'r':
                printf("test read\n");
                cnt = read(fd, rcv_buff, sizeof(rcv_buff));
                if(cnt == -1)
                    printf("Read sbuf error.\n");
                else
                {
                  printf("Read: \tcnt:%d\n", cnt);
                  for(i=0; i<cnt; i++)   
                      printf("%d ", rcv_buff[i]);
                  printf("\n");
                }
         
                break;
            case 'q':
                close(fd);
                return 0;
            case '\n':
                break;
            default:
                printf("worry cmd!\n");
                break;
        }
        }
        close(fd);
        return 0;

}
搜索更多相关主题的帖子: 串口 
2010-07-30 09:41
快速回复:串口读写程序 PC自环测试
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044446 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved