主题 : Tiny6410开发linux串口应用程序问题求教! 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 66493
精华: 0
发帖: 13
金钱: 65 两
威望: 13 点
综合积分: 26 分
注册时间: 2012-03-30
最后登录: 2012-12-17
楼主  发表于: 2012-04-27 14:05

 Tiny6410开发linux串口应用程序问题求教!

我在Tiny6410的linux环境下,编写了个简单地串口应用程序:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<errno.h>
#include<math.h>


#define    FALSE    -1
#define    TRUE    0
            
#define PI 3.14159265358979
#define MAXLEN 3500



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

int OpenDev(char *Dev)
{
    int fd=open(Dev,O_RDWR);
    if(-1==fd)
    {
        perror("Can't Open Serial Port");
        return -1;
    }
    else
    return fd;
}

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);
            status=tcsetattr(fd,TCSANOW,&Opt);
            if(status!=0)
            {
                perror("tcsetattr fd1");
                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':
            options.c_cflag&=~PARENB;
            options.c_iflag&=~INPCK;
            break;
        case 'o':
            options.c_cflag|=(PARODD|PARENB);
            options.c_iflag|=INPCK;
            break;
        case 'e':
            options.c_cflag|=PARENB;
            options.c_cflag&=~PARODD;
            options.c_iflag|=INPCK;
            break;
        case 's':
            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);
    }


    if(parity!='n')
         options.c_iflag|=INPCK;
    tcflush(fd,TCIFLUSH);
    options.c_cc[VTIME]=0;
    options.c_cc[VMIN]=0;
    if(tcsetattr(fd,TCSANOW,&options)!=0)
    {
        perror("Setup Serial 3");
        return (FALSE);
    }

    return (TRUE);
}    

void delayy(void)
{
    int zz;
    int yy;
    for(zz=0;zz<350;zz++);
    for(yy=0;yy<100;yy++);
}
//d to H
int char2str(unsigned char *src, int len, unsigned char *des) {
    int i;
    const char tab[] = "0123456789ABCDEF";
    unsigned char ch;
    for (i = 0; i < len; i++) {
        ch = (src >> 4) & 0xf;
        des[2 * i] = tab[ch];
        ch = (src >> 0) & 0xf;
        des[2 * i + 1] = tab[ch];
    }
    return len * 2;
}
/*****************************************/

int main(int argc,char **argv)
{
    
    int nread;
    char ttbuff[15000]={0,};
    char buff[15000]={0,};
    char *dev="/dev/ttySAC1";//com1
    //int sbuf[1]={1431655765};//55 55 55 55
    int sbuf[1]={5394944};//00 52 52
    //int sbuf[1]={6447616};//00 62 62
    int sfd,retv,i;
    int length=sizeof(sbuf);    
    int count=0.;
    int m;
    int flagg=1;
    char xbuff[15000]={0,};
    int tt=404;
    int pp=1;


    char sbuff[35][500];//35 ge package
    char ssbuff[3500]={0};//3500 data
    int j;
    int aa;
    int k;
    int x_flag=0;
    
    unsigned char dest[35000] = { 0, };
    fd=OpenDev(dev);
    set_speed(fd,19200);
    if(set_Parity(fd,8,1,'n')==FALSE)
    {
        printf("Set Parity Error\n");
        exit(0);
    }
        tcflush(fd,TCIOFLUSH);  
    bzero(xbuff,15000);
    bzero(dest,15000);
    bzero(buff,15000);
    
retv=write(fd,sbuf,length);
    
                 if(retv==-1)
    {
    perror("write");
    }
    printf("the number of char sent is %d\n",retv);
        
    while(flagg)
    {
    
    bzero(buff,15000);
    
        if((nread=read(fd,buff,1))>0)
    {
        for(i=0;i<nread;i++)
        xbuff[count+i]=buff;        
                    count+=nread;
    }
          
            if((count==tt))
            {
            printf("\n%d package receive ok!\n",pp);
            pp++;
            tt+=404;
            }
              
            if(pp==36)
            {
            xbuff[count+1]='\0';
            char2str((unsigned char *)xbuff , count,dest);            
            printf("\ndata: %s\n",dest);
            
            tcflush(fd,TCIOFLUSH);             flagg=0;
            }                
        }
    printf("ok\n");
    if((xbuff[0]==0x00)&&(xbuff[1]==0x6E))
    printf("\npass\n");
}
但是有个问题。例如我第一次发送10 22 23  25 26 ...个数据,能接收到放在xbuff中,打印也正确。但是,第二次再发送这些数据时,发现xbuff的前几个字节还是上次收到的数据的末尾几个字节。
简单说,就是串口无法清除上次接收缓存区的数据。但是,在程序中我已经用了tcflush(fd,TCIOFLUSH)。请教大家!