QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4627|回复: 2

skyeye s3c2410串口设备节点是ttyS0还是ttySAC0啊?

[复制链接]
发表于 2010-12-8 16:32:44 | 显示全部楼层 |阅读模式
这是linux串口通信的程序,
/*写串口程序*/

#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 open_port(int fd,int comport)

{

char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2"};

long vdisable;

if (comport==1)//串口 1

{

fd = open( "/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);

if (-1 == fd){

perror("Can't Open Serial Port");

return(-1);

}

}

else if(comport==2)//串口 2

{

fd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);

if (-1 == fd){

perror("Can't Open Serial Port");

return(-1);

}

}

else if (comport==3)//串口 3

{

fd = open( "/dev/ttyS2", O_RDWR|O_NOCTTY|O_NDELAY);

if (-1 == fd){

perror("Can't Open Serial Port");

return(-1);

}

}

/*恢复串口为阻塞状态*/

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("isatty success!\n");

printf("fd-open=%d\n",fd);

return fd;

}



int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)

{

struct termios newtio,oldtio;

/*保存测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息*/

if ( tcgetattr( fd,&oldtio) != 0) {

perror("SetupSerial 1");

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;

case 460800:

cfsetispeed(&newtio, B460800);

cfsetospeed(&newtio, B460800);

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("com set error");

return -1;

}

printf("set done!\n");

return 0;

}





int main(void)

{

int fd;

int nwrite,i;

char buff[]="Hello\n";

if((fd=open_port(fd,1))<0){//打开串口

perror("open_port error");

return;

}

if((i=set_opt(fd,115200,8,'N',1))<0){//设置串口

perror("set_opt error");

return;

}

printf("fd=%d\n",fd);

for(i=0; i<20; i++){

nwrite=write(fd,buff,6);//写串口

printf("nwrite=%d,%s\n",nwrite,buff);

sleep(1);

}

close(fd);

return;

}


经交叉编译,在skyeye s3c2410下运行,结果如下:
Can't Open Serial Port: No such device or address
open_port error: Illegal seek
说明打开串口设备节点"/dev/ttyS0"失败,但是嵌入式linux下的dev目录下确实存在ttyS0文件

然后我将fd = open( "/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);
改为  fd = open( "/dev/ttySAC0", O_RDWR|O_NOCTTY|O_NDELAY);
再交叉编译,在skyeye s3c2410下运行,结果如下:
fcntl=0
isatty success!
fd-open=3
set done!
fd=3
Hello
nwrite=6,Hello

Hello
nwrite=6,Hello
打开串口成功了,程序也能正常运行,所以说s3c2410开发板的串口设备节点是ttySAC0,而不是ttyS0?
但是我在一些嵌入式linux书里看到的都是说ttyS0代表串口1,ttyS1代表串口2,那ttySAC0和ttyS0到底是什么关系呢?什么时候用ttySAC0,什么时候用ttyS0呢?
对嵌入式linux不是很懂,希望高手能帮小弟解答一下,不胜感激
发表于 2011-4-13 13:07:59 | 显示全部楼层
Lz  按照你的方法做  还是不行啊   依旧出现
Can't Open Serial Port: No such file or directory                              
open_port error: Illegal seek  


刚接触linux不久,LZ能给我讲一讲你是怎样操作的吗????
回复

使用道具 举报

发表于 2011-4-26 20:53:18 | 显示全部楼层
这个应该和linux内核的版本有关吧。
2.4内核中用ttyS0,而2.6中则改成了ttySAC0。
至于ucLinux就不清楚了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-3-28 23:12 , Processed in 0.053670 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表