首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

嵌入式串口编程有关问题

2013-11-26 
嵌入式串口编程问题新手求各位大牛指点!PC串口和TQ2440开发板进行串口通信:问题描述:程序运行后PC串口助手

嵌入式串口编程问题
新手求各位大牛指点!
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");
else
printf("fcntl=%d\n",fcntl(fd,F_SETFL,0));
if(isatty(STDIN_FILENO)==0)
printf("standard input is not a terminal device\n");
else
printf("isattysuccess!\n");
printf("fd-open=%d\n",fd);
return fd;
}

int main(void)
{
int fd;int nwrite,nread,i,j,x,k;
char cmd[]={0xEF,0xEF,0xEA,0x01,0x01,0x00}; 

char buffer[60];
if((fd=open_port(fd,1))<0)
{
perror("open_port error");
return;
}
if((i=set_opt(fd,4800,8,'N',1))<0)
{
perror("set_opt error");
return;
}
printf("fd=%d\n",fd);

nwrite=write(fd,cmd,sizeof(cmd));
if(-1==nwrite)
{
perror("write error");
}else{
printf("write success!nwrite=%d\n",nwrite);
printf("Send data:");
for( i= 0; i< 6; i++ )
printf("%02x ",(unsigned char)cmd[i]);
printf( "\r\n" );
}

while(1)
{
nread=read(fd,buffer,1);
if(nread>0)
{printf("nread=%d",nread);
printf("\r\nReci data:");
for( k= 0; k< nread; k++ )
printf("%02x ",(unsigned char)buffer[k]);
printf( "\r\n" );
}
else
printf("nread=%d,read failure!\n",nread);
sleep(2);
}
close(fd);
return;
}
串口编程
[解决办法]


关闭串口的回显功能
options.c_lflag  &= ~(ICANON 
[解决办法]
 ECHO 
[解决办法]
 ECHOE 
[解决办法]
 ISIG);

热点排行