日期:2014-05-16  浏览次数:20596 次

嵌入式串口编程问题
新手求各位大牛指点!
PC串口和TQ2440开发板进行串口通信:
问题描述:程序运行后PC串口助手可以接收到开发板发来的数据并显示,然后我在PC串口助手手动发送数据到开发板,开发板无法接收数据!且此时串口助手内会显示一堆不知道哪来的数据。
测试控制台显示如下:
[root@EmbedGateway /work]# ./commTest
openttyS0.....
fcntl=0
isattysuccess!
fd-open=3
set done!
fd=3
write success!nwrite=6
Send data:ef ef ea 01 01 00
nread=0,read failure!
nread=0,read failure!
^C
[root@EmbedGateway /work]#

代码如下:
-------------------------------------------------
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<errno.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<termios.h>
#include<stdlib.h>

int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop){
struct termios newtio,oldtio;
if(tcgetattr(fd,&oldtio)!=0)
{
perror("SetupSerial1");
return-1;
}
bzero(&newtio,sizeof(newtio));
newtio.c_cflag|=CLOCAL|CREAD;
newtio.c_cflag&=~CSIZE;
switch(nBits)
{
case 7:newtio.c_cflag|=CS7;break;
case 8:newtio.c_cflag|=CS8;break;
}
switch(nEvent)
{
case 'O': newtio.c_cflag|=PARENB;
      newtio.c_cflag|=PARODD;
      newtio.c_iflag|=(INPCK|ISTRIP);
break;
case 'E': newtio.c_iflag|=(INPCK|ISTRIP);
newtio.c_cflag|=PARENB;
newtio.c_cflag&=~PARODD;
break;
case 'N': newtio.c_cflag&=~PARENB;
break;
}
switch(nSpeed)
{
case 2400:
cfsetispeed(&newtio,B2400);
cfsetospeed(&newtio,B2400);
break;
case 4800:
cfsetispeed(&newtio,B4800);
cfsetospeed(&newtio,B4800);
break;
case 9600:
cfsetispeed(&newtio,B9600);
cfsetospeed(&newtio,B9600);
break;
case 115200:
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio,B115200);
break;
default:
cfsetispeed(&newtio,B9600);
cfsetospeed(&newtio,B9600);
break;
}

if(nStop==1)
newtio.c_cflag&=~CSTOPB;
else if(nStop==2)
newtio.c_cflag|=CSTOPB;

newtio.c_cc[VTIME]=0;
newtio.c_cc[VMIN]=0;
tcflush(fd,TCIFLUSH);

if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
perror("comset error");
return-1;
}
printf("set done!\n");
return 0;
}

int open_port(int fd,int comport)
{
char*dev[]={"/dev/tq2440_serial0","/dev/tq2440_serial1","/dev/tq2440_serial2"};
if(comport==1)
{
fd=open("/dev/tq2440_serial0",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1==fd)
{
perror("Can'tOpenSerialPort");
return(-1);
}else
printf("openttyS0.....\n");}
else if(comport==2)
{
fd=open("/dev/tq2440_serial1",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1==fd)
{
perror("Can'tOpenSerialPort");
return(-1);
}else
printf("openttyS1.....\n");
}
else if(comport==3)
{
fd=open("/dev/tq2440_serial2",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1==fd)
{
perror("Can'tOpenSerialPort");
return(-1);
}else
printf("openttyS2.....\n");
}

if(fcntl(fd,F_SETFL,0)<0)
printf("fcntl failed!\n");
e