• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
主题 : 自定义串口设备名? 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 39689
精华: 0
发帖: 69
金钱: 350 两
威望: 70 点
综合积分: 138 分
注册时间: 2011-03-11
最后登录: 2012-04-22
楼主  发表于: 2011-03-31 20:38

 自定义串口设备名?

请问linux串口设备名怎么自定义啊,我编了串口读写程序,linux上的串口设备名为ttyS0,ttyS1.而在arm11开发板上的串口设备名为ttySAC0,ttySAC1,不能实现通信,很纠结啊,听说可以自定义设备名,小弟是初学者,不知道如何定义,忘高手大虾们指点啊。
级别: 荣誉会员
UID: 34761
精华: 0
发帖: 1348
金钱: 6835 两
威望: 1367 点
综合积分: 2696 分
注册时间: 2010-12-21
最后登录: 2017-06-02
1楼  发表于: 2011-04-01 00:07
不能通信跟设备名关系不大,建议查查串口的参数设置,注意不要用串口0
级别: 侠客
UID: 39689
精华: 0
发帖: 69
金钱: 350 两
威望: 70 点
综合积分: 138 分
注册时间: 2011-03-11
最后登录: 2012-04-22
2楼  发表于: 2011-04-01 12:57

 回 1楼(hacker) 的帖子

串口参数设置都正确。因为设备名不一样,在打开串口时读写程序返回的描述符不一样。
级别: 荣誉会员
UID: 34761
精华: 0
发帖: 1348
金钱: 6835 两
威望: 1367 点
综合积分: 2696 分
注册时间: 2010-12-21
最后登录: 2017-06-02
3楼  发表于: 2011-04-01 21:23
描述符是动态分配的,每次打开有可能不一样是正常的
级别: 侠客
UID: 39689
精华: 0
发帖: 69
金钱: 350 两
威望: 70 点
综合积分: 138 分
注册时间: 2011-03-11
最后登录: 2012-04-22
4楼  发表于: 2011-04-02 15:08

 回 3楼(hacker) 的帖子

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;
    }
    /*清空termio结构变量成员中的值*/
    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_cflag|=PARENB;
            newtio.c_iflag|=(INPCK|ISTRIP);
            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;
}
级别: 侠客
UID: 39689
精华: 0
发帖: 69
金钱: 350 两
威望: 70 点
综合积分: 138 分
注册时间: 2011-03-11
最后登录: 2012-04-22
5楼  发表于: 2011-04-02 15:10
/*打开串口*/
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(fd<0)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
    }
    if(comport==2)//串口2
    {
        fd=open("/dev/ttys1",O_RDWR|O_NOCTTY|O_NDELAY);
        if(fd<0)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
    }
    if(comport==3)//串口3
    {
        fd=open("/dev/ttys2",O_RDWR|O_NOCTTY|O_NDELAY);
        if(fd<0)
        {
            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;
}
级别: 侠客
UID: 39689
精华: 0
发帖: 69
金钱: 350 两
威望: 70 点
综合积分: 138 分
注册时间: 2011-03-11
最后登录: 2012-04-22
6楼  发表于: 2011-04-02 15:12
/*读函数,在pc机上运行*/
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<termios.h>
#include<sys/time.h>
int main(void)
{
    int fd;
    int nread,nwrite,i;
    char buff[8];
    fd_set rd;
    /*打开串口*/
    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;
    }
    /*利用select函数来实现多个串口的读写*/
    FD_ZERO(&rd);
    FD_SET(fd,&rd);
    while(FD_ISSET(fd,&rd))
    {
        if(select(fd+1,&rd,NULL,NULL,NULL)<0)
            perror("select");
        else
        {
            while((nread=read(fd,buff,8))>0)
            {
                printf("nread=%d,%s\n",nread,buff);
            }
        }
        close(fd);
        return;
    }
}
级别: 侠客
UID: 39689
精华: 0
发帖: 69
金钱: 350 两
威望: 70 点
综合积分: 138 分
注册时间: 2011-03-11
最后登录: 2012-04-22
7楼  发表于: 2011-04-02 15:13
/*写函数,在开发板mini6410上运行*/
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<termios.h>
int main()
{
    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);
    /*向串口写入字符串*/
    nwrite=write(fd,buff,8);
    printf("nwrite=%d\n",nwrite);
    close(fd);
    return;
    
}
级别: 侠客
UID: 39689
精华: 0
发帖: 69
金钱: 350 两
威望: 70 点
综合积分: 138 分
注册时间: 2011-03-11
最后登录: 2012-04-22
8楼  发表于: 2011-04-02 15:58

 回 3楼(hacker) 的帖子

读函数和写函数运行时都需打开串口,如果读写函数都使用ttyS0这个设备名的话,写函数会提示不能打开串口,因为在dev目录里面找不到此设备名。(不知道是不是这个问题),我把程序都贴上了,麻烦帮我看下好吗,感激不尽。
级别: 侠客
UID: 39689
精华: 0
发帖: 69
金钱: 350 两
威望: 70 点
综合积分: 138 分
注册时间: 2011-03-11
最后登录: 2012-04-22
9楼  发表于: 2011-04-02 17:15
我把串口的2,3口相连,在宿主机上运行,返回的描述符是一样的,但是读函数还是接受不到数据,哎,求高人指点啊
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go