红联Linux门户
Linux帮助

串口无法正常工作

发布时间:2011-07-05 17:40:14来源:红联作者:lgcHR
[i=s] 本帖最后由 lgcHR 于 2011-7-5 18:04 编辑 [/i]

用这个程序做串口时,串口接收不正常。下面是程序,那个高手帮我看看,最近几天赶着要用。实在看不出哪里有问题
#include
#include
#include
#include
#include
#include
#include
#include

#define FALSE -1
#define TRUE 0

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

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[i])
{
tcflush(fd, TCIOFLUSH);
cfsetispeed(&opt, speed_arr[i]);
cfsetospeed(&opt, speed_arr[i]);
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':
case 'N':
options.c_cflag &= ~PARENB;
options.c_iflag &= ~INPCK;
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);
}

if (parity != 'n')
options.c_iflag |= INPCK;
options.c_cc[VTIME] = 150; // 15 seconds
options.c_cc[VMIN] = 0;

tcflush(fd,TCIFLUSH);
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 fd;
int nread = 0;
char buff[512];
char *dev = "/dev/ttyS0";
fd = OpenDev(dev);
if (fd > 0)
set_speed(fd,9600);
else
{
printf("Can't Open Serial Port!\n");
exit(0);
}
if ( set_Parity(fd,8,1,'N') == FALSE )
{
printf("Set Parity Error\n");
exit(1);
}
while(1)
{
while((nread = read(fd,buff,512))>0)
{
printf("\nLen %d\n",nread);
buff[nread + 1] = '\0';
printf("\n%s",buff);
}
if( nread <= 0 )
{
printf("Read Error!\n");
break;
}
}
return 0;
}

下面是运行结果
[attach]35145[/attach]
文章评论

共有 3 条评论

  1. 流动随风 于 2011-11-22 14:32:48发表:

    学习一下,看看

  2. mpstar 于 2011-07-06 08:47:14发表:

    偶不懂噢

  3. lgcHR 于 2011-07-05 20:21:30发表:

    咋没人看呢?