我在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)。请教大家!